Java秘钥并在c#中复制其行为

本文关键字:复制 Java | 更新日期: 2023-09-27 18:03:54

我试图在c#应用程序中复制Java库中的加密逻辑。

Java包含两个方法,我已经设法在c#中复制了它们。对于任何数据集,我在每个程序中得到相同的结果。

createKey(byte data1[], MessageDigest md);
createIV(byte data2[], MessageDigest md);

Java中生成key和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#中复制它?

Java秘钥并在c#中复制其行为

DES(和DESede)都从64位输入中获得56位密钥材料。剩下的8位在这里用作奇偶校验位。源代码向您展示了Java如何处理此问题,您可以在c#中应用相同的方法。

参见FIPS 46-3开头部分