使用CBC的Java DES加密在每次运行时都会产生不同的结果

时间:2014-06-03 07:45:12

标签: java encryption cryptography des

我正在尝试使用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"可以顺利运行。

1 个答案:

答案 0 :(得分:1)

对于CBC模式,还有另一个输入,即IV(初始化矢量)。确保每次运行使用相同的IV,然后您将得到相同的输出。

有关详细信息,请参阅documentation

顺便说一下。使用随机IV并不是一个坏主意,这样可以确保每次发送多次相同的消息时都会有不同的密文。如果可能的消息数量很少,这一点尤为重要。这使得窃听者更难以猜测某个位模式的含义。

相关问题