使用CBC的JavaDES加密在每次运行时都会给出不同的结果

使用CBC的JavaDES加密在每次运行时都会给出不同的结果,java,encryption,cryptography,des,Java,Encryption,Cryptography,Des,我试图使用JDK1.7JCE(Windows7x64)在一个小数据块上使用CBC执行单DES加密。每次运行下面的程序,我都会得到不同的结果。钥匙是一样的,数据是一样的,有什么问题吗 public class CBCTest { public static void main(String[] args) throws Exception { Cipher cc = Cipher.getInstance("DES/CBC/NoPadding"); Key k

我试图使用JDK1.7JCE(Windows7x64)在一个小数据块上使用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”
工作正常。

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

有关详细信息,请参阅


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

在我的情况下,我确实想要相同的IV,因此只需将其添加到init调用中就可以了。事实上,使用静态IV是一个非常糟糕的主意。这几乎违背了CBC模式而非ECB模式的目的。