使用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;
}
有几件事我不确定:
我还知道我的代码不起作用,因为我知道最终的加密输出应该是什么。在调用
getInstance()
时,您没有指定密码的模式和填充,因此提供程序将选择默认参数。您的提供程序默认为“PKCS5Padding”,因此在执行DES加密之前,它会将值为0x08的8个字节添加到纯文本中
为了避免平台依赖行为,在创建密码
实例时指定完整的转换非常重要:算法、模式和填充。如果您不想要填充,请这样说:
Cipher ciph = Cipher.getInstance("DES/ECB/NoPadding");
SecretKey blah = new SecretKeySpec(key, "DES");
你为什么用键盘?为什么你的密钥开始时不长8字节?如果前7个字节打算用作实际密钥,并且缺少奇偶校验位,那么不能只在末尾加上一个字节;您需要将密钥扩展到8个字节,在每个7位块中添加一个奇偶校验位
如果使用奇偶校验调整键,
3EDCD613A754513B
,并且没有填充,则密码文本为C094C47D7F89E219
。这就是你所期待的吗?非常感谢!这正是我所期望的。