2

我正在尝试将以下 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

4 回答 4

1

我会看一下以前的 SO 帖子,AES 加密的 c# 实现,因为SecretKey(和类似的)对象似乎是高级加密标准(AES)库的一部分。

于 2011-06-04T05:26:18.200 回答
1

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

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

于 2011-06-04T05:29:27.567 回答
0

您的代码片段完全错误/损坏。首先,您正在处理一个 instanceof KeyGenerator 完全错误的情况。如果算法不可用,您的 kgen 实例将为空,这将阻止其余的实例继续并实际使用空引用执行任何操作。

于 2011-06-04T05:29:56.150 回答
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);
}
于 2011-06-05T13:42:00.643 回答