我正在尝试使用JDK 1.7 JCE(Windows 7 x64)在小块上使用CBC执行单DES加密。每次我运行下面的程序,我得到不同的结果。关键是一样的,数据是一样的,可能出错了什么?
public class CBCTest {
public static void main(String[] args) throws Exception {
Cipher cc = Cipher.getInstance("DES/CBC/NoPadding");
Key k = new SecretKeySpec(new byte[] {1,1,1,1,1,1,1,1}, "DES");
cc.init(Cipher.ENCRYPT_MODE, k);
byte[] data = new byte[]{1,2,3,4,5,6,7,8};
cc.doFinal(data);
System.out.println("Encrypted: " + Arrays.toString(cc.doFinal(data)));
}
}
编辑:
将密码模式更改为ECB "DES/CBC/NoPadding"
可以顺利运行。
答案 0 :(得分:1)
对于CBC模式,还有另一个输入,即IV(初始化矢量)。确保每次运行使用相同的IV,然后您将得到相同的输出。
有关详细信息,请参阅documentation。
顺便说一下。使用随机IV并不是一个坏主意,这样可以确保每次发送多次相同的消息时都会有不同的密文。如果可能的消息数量很少,这一点尤为重要。这使得窃听者更难以猜测某个位模式的含义。