JAVA DES加密输出编码

时间:2016-10-24 00:34:08

标签: java encryption encoding utf-8

我在JAVA(javax.crypto.Cipher)中实现了DES加密算法,它成功编码和解码(大多数)字符串...问题是,有时它是消息特定的块(因为DES使用8个字符)块模式下的块。)

在我的情况下,几乎所有第3块都搞砸了,休息时表现不错。

例如:

键:thisiskey

要加密的邮件:Google is an American multinational technology company specializing in Internet-related services

加密邮件(UTF-8格式):

mñqè•ÀPŒ�øf"
ߦ\±õ¤ù'È9¢ëyT ÍQEÁ|;ëâÉ÷JWú

现在,当我去解密时,我明白了:

解密的消息:

Google i,í\O¯‹Ýbº-¸�¬ltinational technology company specializHôJ—=ÊÍnternet-related services

据我所知,这是因为UTF-8无法显示所有字符,因此,在显示以及复制进行解密时,会出现此问题。

有人能建议我解决方案吗? 最好是一个可以处理这个的字符集,或者一个将二进制文件直接转换为HEX(可以输出给用户)的方法,然后是在JAVA中将Vice Versa(在复制/粘贴后解密)的方法。

修改 这是近似的'代码,不精确(例如加密的消息不能正确粘贴,这些是函数的一部分,但它应该给出这个想法)。即使在base64编码中,我也无法正确解密。

Encrypt Function code:

boolean base64 = true;
key = "thisiskey";
plainText = "Google is an American multinational technology company specializing in Internet-related services";

SecretKeyFactory MyKeyFactory = SecretKeyFactory.getInstance("DES");
byte[] keyBytes = key.getBytes();

DESKeySpec generatedKeySpec = new DESKeySpec(keyBytes);
SecretKey generatedSecretKey = MyKeyFactory.generateSecret(generatedKeySpec);

Cipher generatedCipher = Cipher.getInstance("DES");
generatedCipher.init(Cipher.ENCRYPT_MODE, generatedSecretKey);

byte[] messsageStringBytes = plainText.getBytes();
byte[] encryptedMessage = generatedCipher.doFinal(messsageStringBytes);

String encryptedMessageString = new String(encryptedMessage);

if (base64) {
    encryptedMessageString = Base64.getEncoder().encodeToString(encryptedMessageString.getBytes("utf-8"));
}

return encryptedMessageString;

解密功能代码:

boolean dbase64 = true;
dkey = "thisiskey";
messageToDecrypt = "mñqè•ÀPŒ�øf\"ߦ\±õ¤ù'È9¢ëyT ÍQEÁ|;ëâÉ÷JWú"; // Message from above code

SecretKeyFactory MyKeyFactory = SecretKeyFactory.getInstance("DES");
byte[] dkeyBytes = dkey.getBytes();

DESKeySpec generatedKeySpec = new DESKeySpec(dkeyBytes);
SecretKey generatedSecretKey = MyKeyFactory.generateSecret(generatedKeySpec);

Cipher generatedCipher = Cipher.getInstance("DES");
generatedCipher.init(Cipher.DECRYPT_MODE, generatedSecretKey);

if (dbase64) {
    byte[] decodedBytes = Base64.getDecoder().decode(dencryptedText);
    dencryptedText = new String(decodedBytes, "utf-8");
}

byte[] messsageStringBytes = dencryptedText.getBytes();
byte[] encryptedMessage = generatedCipher.doFinal(messsageStringBytes);

String decryptedMessageString = new String(encryptedMessage);

return decryptedMessageString;

1 个答案:

答案 0 :(得分:2)

" UTF-8中的加密邮件"没有意义。密文是二进制的而不是UTF-8。您需要将其放入byte[],而不是String

如果您需要字符串,请使用Base64Hex编码。

  

即使在base64编码中,我也无法正确解密。

String encryptedMessageString = new String(encryptedMessage);

if (base64) {
  encryptedMessageString =  Base64.getEncoder().encodeToString(encryptedMessageString.getBytes("utf-8"));
}

这不起作用。在数据已经中断后(通过调用new String),您将编码为Base64。根本不要把它放在一个字符串中。直接从encryptedMessagebyte[])转到Base64。

相关问题