我正在尝试复制C#应用程序中Java库中的加密逻辑。
Java包含两个我在C#中设法复制的方法。对于任何数据集,我在每个程序中得到相同的结果。
createKey(byte data1[], MessageDigest md);
createIV(byte data2[], MessageDigest md);
在Java中生成密钥和IV的逻辑如下:
public Cipher getCipher(byte[] password) {
MessageDigest md = MessageDigest.getInstance("SHA-1");
byte keyData[] = createKey(byte[] password, md);
SecretKey secretKey =
SecretKeyFactory.getInstance("DESede").
generateSecret(new DESedeKeySpec(keyData[]));
IVSpec ivspec = createIV(secretKey.getEncoded(), md);
Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
cipher.init(1, secretKey, ivSpec, md);
return cipher;
}
假设我有以下内容:
Java Key HEX: 9c 3a 79 df ba 49 86 0 ed 58 1 d8 9b a7 94 0 bb 3e 8f 80 4d 67 0 0
当我构建secretKey然后调用secretKey.getEncoded()时,我得到:
Java Encoded Key: : 9d 3b 79 df ba 49 86 1 ec 58 1 d9 9b a7 94 1 ba 3e 8f 80 4c 67 1 1
因为我不知道SecretKey在内部做了什么,所以我不知道如何在C#中复制它。
我当前的C#代码如下所示:
public static ICryptoTransform createCryptoTransform(String password)
{
ICryptoTransform ct = null;
byte[] keyData = createKey(password);
byte[] ivData = createInitialisationVector(keyData);
printByteArray("keyData", keyData);
printByteArray("ivData", ivData);
TripleDESCryptoServiceProvider tdcsp = new TripleDESCryptoServiceProvider();
tdcsp.Key = keyData; / This seems to be ignored by CreateEncryptor method below
tdcsp.KeySize = 192;
tdcsp.IV = ivData; // This seems to be ignored by CreateEncryptor method below
tdcsp.Mode = CipherMode.CBC;
tdcsp.Padding = PaddingMode.PKCS7; // PKCS5 and PKCS7 provide the same padding scheme
ct = tdcsp.CreateEncryptor(keyData, ivData);
return ct;
}
如您所见,我正在使用从未编码密钥创建的ivData []。
一切正常,就是我得到相同的加密结果,如果我在创建加密器时传递相同的IV数据但不幸的是我无法修改它如何生成它的IVSpec。
SecretKey在内部做什么以及如何在C#中复制它?
答案 0 :(得分:2)
DES(和DESede)都从64位输入中获取56位密钥材料。其余8位用作奇偶校验位。 source code向您展示Java如何处理此问题,您可以在C#中应用相同的内容。
另请参阅FIPS 46-3开头的部分。