我正在尝试将下面的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的一部分吗?
答案 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);
}