将加密代码从java移植到c#时出现一些问题的等价问题#

时间:2011-06-04 05:17:34

标签: c# java encryption equivalent aes

我正在尝试将下面的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 个答案:

答案 0 :(得分:1)

我会看一下以前的SO帖子c# implementations of AES encryption,因为SecretKey(和类似的)对象似乎是Advanced Encryption Standard(AES)库的一部分。

答案 1 :(得分:1)

我的猜测是你可能想看一下System.Security.Cryptography命名空间。

另一方面,虽然似乎没有对这些类进行任何直接翻译,但看起来System.Security.Cryptography.AESManaged可能会提供完成工作的功能。

答案 2 :(得分:0)

您的代码片段完全错误/已损坏。首先,您正在处理将KeyGenerator的实例完全错误的情况。如果算法不可用,那么你的kgen实例将为null,这将阻止其余的继续并实际使用null引用做任何事情。

答案 3 :(得分:0)

我最接近的转换是这个,我使用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);
}