我在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;
答案 0 :(得分:2)
" UTF-8中的加密邮件"没有意义。密文是二进制的而不是UTF-8。您需要将其放入byte[]
,而不是String
。
即使在base64编码中,我也无法正确解密。
String encryptedMessageString = new String(encryptedMessage);
if (base64) {
encryptedMessageString = Base64.getEncoder().encodeToString(encryptedMessageString.getBytes("utf-8"));
}
这不起作用。在数据已经中断后(通过调用new String
),您将编码为Base64。根本不要把它放在一个字符串中。直接从encryptedMessage
(byte[]
)转到Base64。