Проблема с эквивалентностью нескольких вещей при переносе кода шифрования с Java на C # - PullRequest
2 голосов
/ 04 июня 2011

Я пытаюсь перенести приведенный ниже Java-код на C #, но у меня возникли трудности с определением эквивалента:

SecretKey skey
SecretKeySpec skey_spec
IvParameterSpec iv_spec
KeyPair rsaKey
KeyGenerator kgen

Буду признателен, если кто-нибудь поможет мне с этими ...

package entry;

public class Encrypt {
    SecretKey skey;
    SecretKeySpec skey_spec;
    byte[] iv;
    IvParameterSpec iv_spec;

    KeyPair rsaKey;

    Random random;

    public Encrypt() {
        random = new Random();
    }

    public void initAES() {
        System.out.println("Initializing AES Keys...");
        KeyGenerator kgen = null;

        try {
            kgen = KeyGenerator.getInstance("AES");
        } catch(NoSuchAlgorithmException nsae) {
            nsae.printStackTrace();
        }

        kgen.init(256);

        // Generate the secret key specs.
        skey = kgen.generateKey();
        byte[] raw = skey.getEncoded();

        skey_spec = new SecretKeySpec(raw, "AES");

        iv = new byte[16];
        random.nextBytes(iv);
        iv_spec = new IvParameterSpec(iv);
    }
}

ОБНОВЛЕНИЕ попытки в c #:

private byte[] _secretKey_iv;
private byte[] _secretKey;

private void GenerateKey()
{
    RijndaelManaged myAES = new RijndaelManaged();
    myAES.KeySize = 256;
    myAES.GenerateIV();
    myAES.GenerateKey();

    _secretKey_iv = myAES.IV;
    _secretKey = myAES.Key;
}

ОБНОВЛЕНИЕ № 2:

KeyGenerator kgen
SecretKeySpec skey_spec
IvParameterSpec iv_spec

До сих пор не знаю, как получить спецификации из сгенерированного ключа AES, и буду очень признателен за помощь в понимании того, как это сделать. Я до сих пор не уверен, является ли это правильным преобразованием KeyGenerator?

KeyGenerator является частью BouncyCastleProvider?

Ответы [ 4 ]

1 голос
/ 04 июня 2011

Полагаю, вы, вероятно, захотите взглянуть на пространство имен System.Security.Cryptography.

С другой стороны, хотя прямых переводов в эти классы, похоже, нет, похоже, что System.Security.Cryptography.AESManaged может в любом случае обеспечить функции для выполнения работы.

1 голос
/ 04 июня 2011

Я бы взглянул на бывший пост SO, c # реализации шифрования AES , поскольку SecretKey (и аналогичные) объекты являются частью Advanced Encryption Standard (AES) библиотека.

0 голосов
/ 05 июня 2011

Самым близким преобразованием, к которому я пришел, был этот, где я получал параметры, используя метод CastleBouncy, случайные и некоторые другие вещи из кода Java, которые никогда не требовались для воспроизведения преобразования и шифрования на c #

public class Encrypt
{
    private byte[] skey;
    private byte[] iv;
    private ParametersWithIV skey_spec;

    public Encrypt()
    {
    }

    public void initAES()
    {
        RijndaelManaged myAES = new RijndaelManaged();
        myAES.Padding = PaddingMode.PKCS7;
        myAES.Mode = CipherMode.CBC;
        myAES.KeySize = 256;
        myAES.BlockSize = 128;
        myAES.GenerateIV();
        myAES.GenerateKey();

        skey = myAES.Key;
        iv = myAES.IV;

        skey_spec = new ParametersWithIV(new KeyParameter(skey), iv);
    }
}

, который в дальнейшем можно использовать с:

public byte[] aesDecrypt(byte[] data)
{
    IBufferedCipher cipher = CipherUtilities.GetCipher("AES/CBC/PKCS5Padding");
    cipher.Init(false, skey_spec);
    return cipher.DoFinal(data);
}

public byte[] aesEncrypt(byte[] data)
{
    IBufferedCipher cipher = CipherUtilities.GetCipher("AES/CBC/PKCS5Padding");
    cipher.Init(true, skey_spec);
    return cipher.DoFinal(data);
}
0 голосов
/ 04 июня 2011

Ваш фрагмент кода полностью неверен / сломан. Во-первых, вы рассматриваете случай получения экземпляра KeyGenerator совершенно неправильно. Если алгоритм недоступен, ваш экземпляр kgen будет иметь значение null, что не позволит остальным продолжить работу и фактически что-либо делать с нулевой ссылкой.

...