Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用DES算法时,javax.crypto包中的密码类未按预期工作_Java_Encryption_Des - Fatal编程技术网

使用DES算法时,javax.crypto包中的密码类未按预期工作

使用DES算法时,javax.crypto包中的密码类未按预期工作,java,encryption,des,Java,Encryption,Des,这是我的密码: public byte[] encrypt(byte[] key, byte[] pText) throws Exception { System.out.println( DatatypeConverter.printHexBinary(key)); // Outputs: 3FBB589A6A941D01 System.out.println( DatatypeConverter.printHexBinary(pText)); // Outputs: 92F3

这是我的密码:

public byte[] encrypt(byte[] key, byte[] pText) throws Exception
{
    System.out.println( DatatypeConverter.printHexBinary(key)); // Outputs: 3FBB589A6A941D01
    System.out.println( DatatypeConverter.printHexBinary(pText)); // Outputs: 92F3BD61F852727E
    Cipher ciph = Cipher.getInstance("DES");
    SecretKey blah = new SecretKeySpec(key, 0, key.length, "DES");

    ciph.init(Cipher.ENCRYPT_MODE,  blah);
    byte[] test = ciph.doFinal(pText); 
    System.out.println( DatatypeConverter.printHexBinary(test)); // Outputs: 4799F8A1C0A427E17E2B19DD22064444

    return test;
}
有几件事我不确定:

  • 我用01填充键,这就是为什么第一行的输出以01结束。我尝试用0填充它,但也不起作用。所需的长度为8字节。所以我不确定我是否做对了
  • 我不完全确定SecretKey构造函数中的offset是什么意思(第二个参数)。我假设它应该是0
  • 我的主要问题是为什么测试(密文)是16字节?根据第13页,它应该只有8个字节

  • 我还知道我的代码不起作用,因为我知道最终的加密输出应该是什么。

    在调用
    getInstance()
    时,您没有指定密码的模式和填充,因此提供程序将选择默认参数。您的提供程序默认为“PKCS5Padding”,因此在执行DES加密之前,它会将值为0x08的8个字节添加到纯文本中

    为了避免平台依赖行为,在创建
    密码
    实例时指定完整的转换非常重要:算法、模式和填充。如果您不想要填充,请这样说:

    Cipher ciph = Cipher.getInstance("DES/ECB/NoPadding");
    SecretKey blah = new SecretKeySpec(key, "DES");
    
    你为什么用键盘?为什么你的密钥开始时不长8字节?如果前7个字节打算用作实际密钥,并且缺少奇偶校验位,那么不能只在末尾加上一个字节;您需要将密钥扩展到8个字节,在每个7位块中添加一个奇偶校验位


    如果使用奇偶校验调整键,
    3EDCD613A754513B
    ,并且没有填充,则密码文本为
    C094C47D7F89E219
    。这就是你所期待的吗?

    非常感谢!这正是我所期望的。