Java DES加密错误
Java DES Wrong Encryption
我使用内置库在 Java 中编码了 DES,但我没有得到正确的加密结果。请解释我哪里出错了
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.xml.bind.DatatypeConverter;
public class MainClass {
public static void main(String[] args) {
String l = "0e329232ea6d0d73";
byte[] a = DatatypeConverter.parseHexBinary(l);
try{
DESKeySpec dks = new DESKeySpec(a);
SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
SecretKey sk = skf.generateSecret(dks);
Cipher c = Cipher.getInstance("DES");
c.init(Cipher.ENCRYPT_MODE, sk);
String M = "8787878787878787";
byte[] b = c.doFinal(M.getBytes());
System.out.println(new String(b));
c.init(Cipher.DECRYPT_MODE, sk);
System.out.println(new String(c.doFinal(b)));
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
}
十六进制 16 位密钥:0e329232ea6d0d73
纯文本:8787878787878787
加密:–m^MúÊ'+–m^MúÊ'+©ôÈÓ—
所需加密:0000000000000000
这就是我说的在线计算器加密输出的答案是0000,和我的完全不一样:
数据为:十六进制8787878787878787
需要转为二进制。
`
那个在线计算器的输入是十六进制的,这意味着数据转换。您没有在代码中进行任何十六进制转换:您只是在 ASCII 中提供以 10 为底的数字。
改变
byte[] b = c.doFinal(M.getBytes());
到
byte[] b = c.doFinal(DatatypeConverter.parseHexBinary(M));
此外,在你的代码中使用 ECB 模式(因为你在图片中标记了 ECB)。喜欢:
Cipher c = Cipher.getInstance("DES/ECB/NoPadding");
String.getBytes() encodes the String into a sequence of bytes using the platform's default charset, storing the result into a new byte array. In your case which is an array of length 16 containing values 56 55 56 55...
ASCII表示8787...
您需要将十六进制 8787...
转换为二进制。
我使用内置库在 Java 中编码了 DES,但我没有得到正确的加密结果。请解释我哪里出错了
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.xml.bind.DatatypeConverter;
public class MainClass {
public static void main(String[] args) {
String l = "0e329232ea6d0d73";
byte[] a = DatatypeConverter.parseHexBinary(l);
try{
DESKeySpec dks = new DESKeySpec(a);
SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
SecretKey sk = skf.generateSecret(dks);
Cipher c = Cipher.getInstance("DES");
c.init(Cipher.ENCRYPT_MODE, sk);
String M = "8787878787878787";
byte[] b = c.doFinal(M.getBytes());
System.out.println(new String(b));
c.init(Cipher.DECRYPT_MODE, sk);
System.out.println(new String(c.doFinal(b)));
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
}
十六进制 16 位密钥:0e329232ea6d0d73
纯文本:8787878787878787
加密:–m^MúÊ'+–m^MúÊ'+©ôÈÓ—
所需加密:0000000000000000
这就是我说的在线计算器加密输出的答案是0000,和我的完全不一样:
数据为:十六进制8787878787878787
需要转为二进制。
`
那个在线计算器的输入是十六进制的,这意味着数据转换。您没有在代码中进行任何十六进制转换:您只是在 ASCII 中提供以 10 为底的数字。
改变
byte[] b = c.doFinal(M.getBytes());
到
byte[] b = c.doFinal(DatatypeConverter.parseHexBinary(M));
此外,在你的代码中使用 ECB 模式(因为你在图片中标记了 ECB)。喜欢:
Cipher c = Cipher.getInstance("DES/ECB/NoPadding");
String.getBytes() encodes the String into a sequence of bytes using the platform's default charset, storing the result into a new byte array. In your case which is an array of length 16 containing values 56 55 56 55...
ASCII表示8787...
您需要将十六进制 8787...
转换为二进制。