Java SecretKey и копирование его поведения в C # - PullRequest
1 голос
/ 28 июля 2011

Я пытаюсь воспроизвести логику шифрования, найденную в библиотеке Java в приложении C #.

Java содержит два метода, которые мне удалось воспроизвести в C #. Я получаю одинаковые результаты в каждой программе для любого набора данных.

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

Логика для генерации ключа и IV в Java следующая:

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 #?

1 Ответ

2 голосов
/ 28 июля 2011

DES (и DESede) оба получают 56 бит материала ключа из 64 битного ввода. Остальные 8 бит используются здесь как биты контроля четности. Исходный код показывает, как Java справляется с этим, вы можете применить то же самое в C #.

См. Также раздел в начале FIPS 46-3 .

...