我对JCE感到困惑,我尝试了一些使用JCE加密解密技术加密和解密某些文本的示例和示例代码,但是达成了令人困惑的结论,或者可能缺少整个概念。实际上,我想要的是使用各种着名算法用人类可读的字母数字密钥加密某些文本,然后用相同的密钥对其进行解密。这是我试过的第一个例子
String text = "Hello World";
String key = "Bar12345kjkj5454hggx1234";
// Create key and cipher
Key aesKey = new SecretKeySpec(key.getBytes(), "DESede");
Cipher cipher = Cipher.getInstance("DESede");
// encrypt the text
cipher.init(Cipher.ENCRYPT_MODE, aesKey);
byte[] encrypted = cipher.doFinal(text.getBytes());
System.err.println("Using Tripple DES algorithm and with key <"+key+">, <"+text+"> converted into <"+new String(encrypted)+">");
// decrypt the text
String key1 = "Bar12345kkkj5454hggx1234"; // 128 bit key
Key aesKey1 = new SecretKeySpec(key1.getBytes(), "DESede");
Cipher cipher1 = Cipher.getInstance("DESede");
cipher1.init(Cipher.DECRYPT_MODE, aesKey1);
String decrypted = new String(cipher1.doFinal(encrypted));
System.err.println("Using Tripple DES algorithm and with key <"+key1+">, encrypted text <"+new String(encrypted)+"> decrypted into <"+decrypted+">");
令人困惑的是使用不同的密钥,我也可以解密最初使用不同密钥加密的数据,这是否有意义。如果提供的解密密钥与用于加密的密钥不完全相同,则应该失败。
有人可以帮助我理解为什么会这样发生,如果我们能用错误的密钥解密数据,那么拥有这些算法的目的是什么?那么安全点是什么?< / p>
提前致谢! 和Manish
答案 0 :(得分:2)
如果我没有弄错的话,那就是当你将'k'和'j'转换为字节时,你得到的字节只是它们的最后一位有所不同,而DES算法认为它是一个奇偶校验位并从钥匙中排除它。
请参阅http://en.wikipedia.org/wiki/Triple_DES
要显示会发生什么,请尝试以下代码:
SecretKeyFactory kf = SecretKeyFactory.getInstance("DESede");
SecretKey parityAdjusted = kf.generateSecret(new DESedeKeySpec(aesKey.getEncoded()));
SecretKey parityAdjusted1 = kf.generateSecret(new DESedeKeySpec(aesKey1.getEncoded()));
System.out.println(new String(parityAdjusted.getEncoded()));
System.out.println(new String(parityAdjusted1.getEncoded()));
将输出:
Cas12244kkkk4444hggy1224
Cas12244kkkk4444hggy1224
如您所见,奇偶校验调整后两个键基本上是相同的键。