Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Bouncy castle c#中使用RSA打开密钥?_C#_Encryption_Rsa_Bouncycastle - Fatal编程技术网

如何在Bouncy castle c#中使用RSA打开密钥?

如何在Bouncy castle c#中使用RSA打开密钥?,c#,encryption,rsa,bouncycastle,C#,Encryption,Rsa,Bouncycastle,如何在Bouncy castle中使用RSA私钥打开密钥?我收到已包装的密钥,该密钥是使用RSA公钥包装的。我有RSA密钥对。我只是在C#Bouncy Castle中找不到可以用来打开它的api C#源代码()中的这段代码目前已被注释掉。RSA的注释行正是我所需要的,但当我尝试使用它们时,它似乎已被删除或从未实现 Key key = cipher.unwrap(wrappedKey, "RSA", IBufferedCipher.PRIVATE_KEY); 上面这行正是我需要的。为什么被评论掉

如何在Bouncy castle中使用RSA私钥打开密钥?我收到已包装的密钥,该密钥是使用RSA公钥包装的。我有RSA密钥对。我只是在C#Bouncy Castle中找不到可以用来打开它的api

C#源代码()中的这段代码目前已被注释掉。RSA的注释行正是我所需要的,但当我尝试使用它们时,它似乎已被删除或从未实现

Key key = cipher.unwrap(wrappedKey, "RSA", IBufferedCipher.PRIVATE_KEY);
上面这行正是我需要的。为什么被评论掉了?WrapTest.cs中的完整函数如下所示:

public ITestResult Perform()
{
    try
        {
//              IBufferedCipher cipher = CipherUtilities.GetCipher("DES/ECB/PKCS5Padding");
            IWrapper cipher = WrapperUtilities.GetWrapper("DES/ECB/PKCS5Padding");

            IAsymmetricCipherKeyPairGenerator fact = GeneratorUtilities.GetKeyPairGenerator("RSA");
            fact.Init(
                new RsaKeyGenerationParameters(
                    BigInteger.ValueOf(0x10001),
                    new SecureRandom(),
                    512,
                    25));

            AsymmetricCipherKeyPair keyPair = fact.GenerateKeyPair();

            AsymmetricKeyParameter priKey = keyPair.Private;
            AsymmetricKeyParameter pubKey = keyPair.Public;

            byte[] priKeyBytes = PrivateKeyInfoFactory.CreatePrivateKeyInfo(priKey).GetDerEncoded();

            CipherKeyGenerator keyGen = GeneratorUtilities.GetKeyGenerator("DES");

//              Key wrapKey = keyGen.generateKey();
            byte[] wrapKeyBytes = keyGen.GenerateKey();
            KeyParameter wrapKey = new DesParameters(wrapKeyBytes);

//              cipher.Init(IBufferedCipher.WRAP_MODE, wrapKey);
            cipher.Init(true, wrapKey);
//              byte[] wrappedKey = cipher.Wrap(priKey);
            byte[] wrappedKey = cipher.Wrap(priKeyBytes, 0, priKeyBytes.Length);

//              cipher.Init(IBufferedCipher.UNWRAP_MODE, wrapKey);
            cipher.Init(false, wrapKey);

//              Key key = cipher.unwrap(wrappedKey, "RSA", IBufferedCipher.PRIVATE_KEY);
            byte[] unwrapped = cipher.Unwrap(wrappedKey, 0, wrappedKey.Length);

            //if (!Arrays.AreEqual(priKey.getEncoded(), key.getEncoded()))
            if (!Arrays.AreEqual(priKeyBytes, unwrapped))
            {
                return new SimpleTestResult(false, "Unwrapped key does not match");
            }

            return new SimpleTestResult(true, Name + ": Okay");
        }
        catch (Exception e)
        {
            return new SimpleTestResult(false, Name + ": exception - " + e.ToString());
        }

}

我不完全清楚您需要什么,但您可以使用RSA密钥在Bouncycastle中包装和打开AES密钥。下面是一个Java示例,它创建一个RSA密钥对,将私钥保存到一个文件中,然后保存一个封装在公钥中的AES密钥

导入javax.crypto.Cipher;
导入javax.crypto.KeyGenerator;
导入javax.crypto.SecretKey;
导入java.nio.file.Files;
导入java.nio.file.path;
导入java.security.KeyPair;
导入java.security.KeyPairGenerator;
导入java.security.SecureRandom;
公共班机{
private static final SecureRandom rand=new SecureRandom();
公共静态void main(字符串[]args)引发异常{
KeyPairGenerator kpg=KeyPairGenerator.getInstance(“RSA”);
kpg.初始化(1024,rand);
KeyPair kp=kpg.generateKeyPair();
//将私钥写入文件PKCS8编码的DER
write(path.get(“privkey.der”)、kp.getPrivate().getEncoded();
KeyGenerator kg=KeyGenerator.getInstance(“AES”);
千克初始值(256兰特);
SecretKey aesKey=kg.generateKey();
Cipher c=Cipher.getInstance(“RSA/ECB/PKCS1PADDING”);
c、 init(Cipher.WRAP_模式,kp.getPublic(),rand);
字节[]wrappedKey=c.wrap(aesKey);
//写出包装好的密钥
write(path.get(“wrappedkey”),wrappedkey);
}
}
下面是一个C#示例,它使用Java示例的输出并打开AES密钥

使用System.IO;
使用Org.BouncyCastle.Asn1;
使用Org.BouncyCastle.Asn1.Pkcs;
使用Org.BouncyCastle.Crypto;
使用Org.BouncyCastle.Crypto.Parameters;
使用Org.BouncyCastle.Security;
命名空间使用Bouncy进行解密
{
类主类
{
私有静态键参数展开(字节[]键,AsymmetricKeyParameter privKeyParam){
var wrapper=WrapperUtilities.GetWrapper(“RSA/NONE/PKCS1PADDING”);
Init(false,privKeyParam);
var aesKeyBytes=wrapper.Unwrap(key,0,key.Length);
返回新的KeyParameter(AESKYbytes);
}
公共静态void Main(字符串[]args)
{
var privKeyBytes=File.ReadAllBytes(“../../privkey.der”);
var seq=Asn1Sequence.GetInstance(privKeyBytes);
var rsaKeyParams=PrivateKeyFactory.CreateKey(PrivateKeyInfo.GetInstance(seq));
var wrappedKey=File.ReadAllBytes(“../../wrappedKey”);
var aesKey2=展开(wrappedKey,rsaKeyParams);
}
}
}

您必须根据自己的需要进行调整。

我不完全清楚您需要什么,但您可以使用RSA密钥在Bouncycastle中包装和打开AES密钥。下面是一个Java示例,它创建一个RSA密钥对,将私钥保存到一个文件中,然后保存一个封装在公钥中的AES密钥

导入javax.crypto.Cipher;
导入javax.crypto.KeyGenerator;
导入javax.crypto.SecretKey;
导入java.nio.file.Files;
导入java.nio.file.path;
导入java.security.KeyPair;
导入java.security.KeyPairGenerator;
导入java.security.SecureRandom;
公共班机{
private static final SecureRandom rand=new SecureRandom();
公共静态void main(字符串[]args)引发异常{
KeyPairGenerator kpg=KeyPairGenerator.getInstance(“RSA”);
kpg.初始化(1024,rand);
KeyPair kp=kpg.generateKeyPair();
//将私钥写入文件PKCS8编码的DER
write(path.get(“privkey.der”)、kp.getPrivate().getEncoded();
KeyGenerator kg=KeyGenerator.getInstance(“AES”);
千克初始值(256兰特);
SecretKey aesKey=kg.generateKey();
Cipher c=Cipher.getInstance(“RSA/ECB/PKCS1PADDING”);
c、 init(Cipher.WRAP_模式,kp.getPublic(),rand);
字节[]wrappedKey=c.wrap(aesKey);
//写出包装好的密钥
write(path.get(“wrappedkey”),wrappedkey);
}
}
下面是一个C#示例,它使用Java示例的输出并打开AES密钥

使用System.IO;
使用Org.BouncyCastle.Asn1;
使用Org.BouncyCastle.Asn1.Pkcs;
使用Org.BouncyCastle.Crypto;
使用Org.BouncyCastle.Crypto.Parameters;
使用Org.BouncyCastle.Security;
命名空间使用Bouncy进行解密
{
类主类
{
私有静态键参数展开(字节[]键,AsymmetricKeyParameter privKeyParam){
var wrapper=WrapperUtilities.GetWrapper(“RSA/NONE/PKCS1PADDING”);
Init(false,privKeyParam);
var aesKeyBytes=wrapper.Unwrap(key,0,key.Length);
返回新的KeyParameter(AESKYbytes);
}
公共静态void Main(字符串[]args)
{
var privKeyBytes=File.ReadAllBytes(“../../privkey.der”);
var seq=Asn1Sequence.GetInstance(privKeyBytes);
var rsaKeyParams=PrivateKeyFactory.CreateKey(PrivateKeyInfo.GetInstance(seq));
var wrappedKey=File.ReadAllBytes(“../../wrappedKey”);
var aesKey2=展开(wrappedKey,rsaKeyParams);
}
}
}

您必须根据自己的需要对其进行调整。

您说的是Java,对吗?这段代码在哪里被注释掉了,为什么依赖它?你可以在你的代码中使用它。你能包含更多的代码吗?目前我们甚至不知道
密码
变量的类型@阿乔姆