- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一个证书分发系统来跟踪客户和其他内容。
发生的情况是:
所以在客户端会发生这种情况:
//Pseudo Server Object:
Server s = new Server();
//Requested Certificate Name and things
X509Name name = new X509Name("CN=Client Cert, C=NL");
//Key generation 2048bits
RsaKeyPairGenerator rkpg = new RsaKeyPairGenerator();
rkpg.Init(new KeyGenerationParameters(new SecureRandom(), 2048));
AsymmetricCipherKeyPair ackp = rkpg.GenerateKeyPair();
//PKCS #10 Certificate Signing Request
Pkcs10CertificationRequest csr = new Pkcs10CertificationRequest("SHA1WITHRSA", name, ackp.Public, null, ackp.Private);
//Make it a nice PEM thingie
StringBuilder sb = new StringBuilder();
PemWriter pemwrit = new PemWriter(new StringWriter(b));
pemwrit.WriteObject(csr);
pemwrit.Writer.Flush();
s.SendRequest(sb.ToSting());
好吧,所以我将跳过服务器端,相信我,服务器签署证书并将其发送回客户端。这就是我将采取行动的地方。
PemReader pr = new PemReader(new StringReader(b.ToString()));
X509Certificate cert = (X509Certificate)pr.ReadObject();
//So lets asume I saved the AsymmetricCipherKeyPair (ackp) from before
//I have now the certificate and my private key;
//first I make it a "Microsoft" x509cert.
//This however does not have a PrivateKey thats in the AsymmetricCipherKeyPair (ackp)
System.Security.Cryptography.X509Certificates.X509Certificate2 netcert = DotNetUtilities.ToX509Certificate(cert);
//So here comes the RSACryptoServerProvider:
System.Security.Cryptography.RSACryptoServiceProvider rcsp = new System.Security.Cryptography.RSACryptoServiceProvider();
//And the privateKeyParameters
System.Security.Cryptography.RSAParameters parms = new System.Security.Cryptography.RSAParameters();
//now I have to translate ackp.PrivateKey to parms;
RsaPrivateCrtKeyParameters BCKeyParms = ((RsaPrivateCrtKeyParameters)ackp1.Private);
//D is the private exponent
parms.Modulus = BCKeyParms.Modulus.ToByteArray();
parms.P = BCKeyParms.P.ToByteArray();
parms.Q = BCKeyParms.Q.ToByteArray();
parms.DP = BCKeyParms.DP.ToByteArray();
parms.DQ = BCKeyParms.DQ.ToByteArray();
parms.InverseQ = BCKeyParms.QInv.ToByteArray();
parms.D = BCKeyParms.Exponent.ToByteArray();
parms.Exponent = BCKeyParms.PublicExponent.ToByteArray();
//Now I should be able to import the RSAParameters into the RSACryptoServiceProvider
rcsp.ImportParameters(parms);
//<em><b>not really</b></em> This breaks says "Bad Data" and not much more. I'll Post the
//stacktrace at the end
//I open up the windows cert store because thats where I want to save it.
//Add it and save it this works fine without the privkey.
X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.MaxAllowed);
store.Add(netcert);
store.Close();
现在您可能认为服务器端一定出了问题。嗯,这也是我的想法,但是当我从这个证书制作一个 pfx 文件并手动导入它时,它工作得很好......
不知何故,.NET RSA 私钥和 BouncyCaSTLe RSA 私钥之间存在差异,但我无法确定。
您可能会建议导入 pfx,然后通过 X509Store 从中获取私钥。我试过。 :S 并且失败了。一旦我尝试 ExportParameters(true)
,true 就代表包含私有(private)参数。它说“ key 在指定状态下无效。”。请参阅最后的完整异常。
我希望你们中的一些人以前杀过这头 pig 或者可以帮助我。
***Exceptions:***
System.Security.Cryptography.CryptographicException was unhandled
Message="Key not valid for use in specified state.\r\n"
Source="mscorlib"
StackTrace:
at System.Security.Cryptography.CryptographicException.ThrowCryptogaphicException(Int32 hr)
at System.Security.Cryptography.Utils._ExportKey(SafeKeyHandle hKey, Int32 blobType, Object cspObject)
at System.Security.Cryptography.RSACryptoServiceProvider.ExportParameters(Boolean includePrivateParameters)
InnerException:
***And the other one:***
System.Security.Cryptography.CryptographicException was unhandled
Message="Bad Data.\r\n"
Source="mscorlib"
StackTrace:
at System.Security.Cryptography.CryptographicException.ThrowCryptogaphicException(Int32 hr)
at System.Security.Cryptography.Utils._ImportKey(SafeProvHandle hCSP, Int32 keyNumber, CspProviderFlags flags, Object cspObject, SafeKeyHandle& hKey)
at System.Security.Cryptography.RSACryptoServiceProvider.ImportParameters(RSAParameters parameters)
InnerException:
最佳答案
答案(来自用户名)指向正确的方向:填充。
Bouncy-caSTLe 来自 git 的最新版本具有以下代码:
public static RSAParameters ToRSAParameters(RsaPrivateCrtKeyParameters privKey)
{
RSAParameters rp = new RSAParameters();
rp.Modulus = privKey.Modulus.ToByteArrayUnsigned();
rp.Exponent = privKey.PublicExponent.ToByteArrayUnsigned();
rp.P = privKey.P.ToByteArrayUnsigned();
rp.Q = privKey.Q.ToByteArrayUnsigned();
rp.D = ConvertRSAParametersField(privKey.Exponent, rp.Modulus.Length);
rp.DP = ConvertRSAParametersField(privKey.DP, rp.P.Length);
rp.DQ = ConvertRSAParametersField(privKey.DQ, rp.Q.Length);
rp.InverseQ = ConvertRSAParametersField(privKey.QInv, rp.Q.Length);
return rp;
}
private static byte[] ConvertRSAParametersField(BigInteger n, int size)
{
byte[] bs = n.ToByteArrayUnsigned();
if (bs.Length == size)
return bs;
if (bs.Length > size)
throw new ArgumentException("Specified size too small", "size");
byte[] padded = new byte[size];
Array.Copy(bs, 0, padded, size - bs.Length, bs.Length);
return padded;
}
nb:此代码不在 bouncy caSTLe 的 nuget 版本(2011)中,或者在大多数代码示例中只是简单地复制了 RSA 参数。
此代码与您在其他任何地方看到的代码不同,后者基本上复制/粘贴关键参数,并且不执行额外的填充步骤。
关于.net - BouncyCasSTLe RSAPrivateKey 到 .NET RSAPrivateKey,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/949727/
我正在创建一个证书分发系统来跟踪客户和其他内容。 发生的情况是: 客户端向服务器发送 CSR 服务器检查并签署证书 服务器将签名证书发送给客户端 客户将签名证书和私钥放入 Windows 存储区。 所
您好,我正在尝试解密使用 RSA 公钥加密的文件。我有一个3072位的RSA私钥对应pubkey。该文件包含 key 的 PKCS8 编码的原始字节。我在字节数组 rsa_priv 中。 public
如何创建 java.security.interfaces.RSAPrivateKey 的实例给定 RSA 的 d、e 和 n(假设为 BigIntegers)。 (此处 d 表示私有(private
所以我有这个代码 private static RSAPrivateKey buildRSAPrivateKey(String privateKey) { PEMReader pemR
我有一个 java.security.interfaces.RSAPrivateKey 和相应的 java.security.interfaces.RSAPublicKey 包含(仅)模数、私有(pr
我使用 RSA 2048 key 加密和解密。但为了提高安全性,我需要使用 AES 128 方法为 RSAPrivateKey 使用密码。 我可以生成这个 key ,但我不知道如何在 JAVA 中使用
我正在学习本教程:How to use the Android Keystore to store passwords and other sensitive information .它(松散地)与
我正在学习本教程:How to use the Android Keystore to store passwords and other sensitive information .它(松散地)与
我不知道如何问这个问题,但我正在尝试使用来自网络的各种 Json Web Token 实现(无论是 java-jwt 还是 jjwt 等),它们都接受 RSAPrivateKey 作为签名过程的一部分
RSAPublicKey 和 Java 中的 PublicKey 之间的主要区别是什么?我也对 RSAPrivateKey 和 PrivateKey 问同样的问题。 最佳答案 Cipher 和 Sig
我是一名优秀的程序员,十分优秀!