我们有一个C#/. Net 4.0应用程序,它从PEM文件中导入RSA私钥到RSACryptoServiceProvider。
该应用程序适用于512到4096位的RSA密钥,但不适用于特殊类型的RSA私钥。
在这里您可以找到两个示例键:测试键
OpenSSL命令:OpenSSL genrsa-out PRIVATE。钥匙2048
主要区别在于两个素数(p和q)的选择。它们不是由1024位生成的,而是非工作密钥中的1023位和1025位。根据RSA规范,这应该没问题。
但是在重要参数()上,我们总是得到一个带有“坏数据”的密码异常。有什么想法吗?如何获得更多信息,为什么私钥数据被拒绝,或者如何获得更多信息?如果微软要求rsa密钥,我们搜索信息,但找不到任何有用的规格。
OpenSSL和各种智能卡都可以使用这两个密钥,在使用这些私钥进行测试时也可以使用这些密钥。
以下是字节长度:
工作键:
不工作键:
还试图用BouncyCastle解析PEM文件并从中导出RsaParameter,但它们也被“坏数据”拒绝。(顺便说一句,使用BouncyCastle不是一个选项。:()
提前谢谢!
如果你用BouncyCastle来做这项工作会更好。下面是一些使用Rsa传递公钥进行加密和私钥进行解密的代码。这两个关键点也是使用BouncyCastle生成的,如您所见:
class Program
{
private static string _csr;
private static string _publicKey;
private static string _privateKey;
static void Main(string[] args)
{
GeneratePkcs10("braspag.com.br", "braspag", "BR", RootLenght.RootLength2048);
CryptDecryptTest();
Console.ReadKey();
}
private static void GeneratePkcs10
(string domainName, string companyName, string countryIso2Characters, RootLenght rootLength)
{
try
{
var rsaKeyPairGenerator = new RsaKeyPairGenerator();
var secureRandom = new SecureRandom();
// Note: the numbers {3, 5, 17, 257 or 65537} as Fermat primes.
// NIST doesn't allow a public exponent smaller than 65537, since smaller exponents are a problem if they aren't properly padded.
// Note: the default in openssl is '65537', i.e. 0x10001.
var genParam = new RsaKeyGenerationParameters
(BigInteger.ValueOf(0x10001), secureRandom, (int)rootLength, 128);
rsaKeyPairGenerator.Init(genParam);
AsymmetricCipherKeyPair pair = rsaKeyPairGenerator.GenerateKeyPair();
IDictionary attrs = new Hashtable();
attrs.Add(X509Name.CN, domainName);
attrs.Add(X509Name.O, companyName);
attrs.Add(X509Name.C, countryIso2Characters);
var subject = new X509Name(new ArrayList(attrs.Keys), attrs);
var textWriter = new StringWriter(CultureInfo.InvariantCulture);
var pemWriter = new PemWriter(textWriter);
pemWriter.WriteObject(pair.Private);
pemWriter.Writer.Flush();
_privateKey = textWriter.ToString();
textWriter.Close();
textWriter = new StringWriter(CultureInfo.InvariantCulture);
pemWriter = new PemWriter(textWriter);
pemWriter.WriteObject(pair.Public);
pemWriter.Writer.Flush();
_publicKey = textWriter.ToString();
textWriter.Close();
ISignatureFactory signatureFactory = new Asn1SignatureFactory("SHA256WITHRSA", pair.Private, secureRandom);
var pkcs10CertificationRequest = new Pkcs10CertificationRequest
(signatureFactory, subject, pair.Public, null, pair.Private);
_csr = Convert.ToBase64String(pkcs10CertificationRequest.GetEncoded());
}
catch (Exception ex)
{
throw ex;
}
}
private static void CryptDecryptTest()
{
const string originalText = "test";
var encryptedText = RsaEncryptWithPublic(originalText, _publicKey);
var decryptedText = RsaDecryptWithPrivate(encryptedText, _privateKey);
Console.WriteLine(string.Format("Original Text: {0}", originalText));
Console.WriteLine(string.Format("Encrypted Text: {0}", encryptedText));
Console.WriteLine(string.Format("Decrypted Text: {0}", decryptedText));
}
public static string RsaEncryptWithPublic(string clearText, string publicKey)
{
var bytesToEncrypt = Encoding.UTF8.GetBytes(clearText);
var encryptEngine = new Pkcs1Encoding(new RsaEngine());
using (var txtreader = new StringReader(publicKey))
{
var keyParameter = (AsymmetricKeyParameter)new PemReader(txtreader).ReadObject();
encryptEngine.Init(true, keyParameter);
}
var encrypted = Convert.ToBase64String(encryptEngine.ProcessBlock(bytesToEncrypt, 0, bytesToEncrypt.Length));
return encrypted;
}
public static string RsaDecryptWithPrivate(string base64Input, string privateKey)
{
var bytesToDecrypt = Convert.FromBase64String(base64Input);
AsymmetricCipherKeyPair keyPair;
var decryptEngine = new Pkcs1Encoding(new RsaEngine());
using (var txtreader = new StringReader(privateKey))
{
keyPair = (AsymmetricCipherKeyPair)new PemReader(txtreader).ReadObject();
decryptEngine.Init(false, keyPair.Private);
}
var decrypted = Encoding.UTF8.GetString(decryptEngine.ProcessBlock(bytesToDecrypt, 0, bytesToDecrypt.Length));
return decrypted;
}
private enum RootLenght
{
RootLength2048 = 2048,
RootLength3072 = 3072,
RootLength4096 = 4096,
}
}
我也有类似的问题。多亏了你,我注意到一些缓冲区比预期多了一个字节。所有这些都有0作为第一个字节和一个值
以防其他人遇到同样的问题。一个MSDN Mod给了我一个与infos的链接,微软认为RSA密钥应该是什么样子。
2.2.2.9RSA私钥BLOB
对于2048位RSA密钥,P和Q预计分别为128字节...
(我正在用MAC) 我的id_rsa以 但我希望一开始 我已将我的身份证发送给rsa。发布给服务器管理员以获得对服务器的访问权,因此我不想生成新密钥。 > 有什么方法可以将我的id_rsaopenssh私钥转移到RSA私钥吗?(请指挥。) 如果我可以传输,我是否还需要传输id_rsa。酒吧(请发命令。)看来是我的错。pub没有像id_rsa这样的头,所以我不确定是否也应该传输它。 非常感谢。
我一直在阅读一些RSA文献和堆栈溢出问题,但我没有得到明确的答案。 仅给定一个RSA私钥模和私钥指数,这是我所拥有的全部(也足够用于所有密码相关操作),我能得到相关的公钥模和公钥指数吗? 另外,我是否可以仅用这两个参数获得私钥的编码形式?我在java中尝试了以下方法(java不是实际的请求),但是支持它的OpenSSL引擎失败,错误为:04000090:RSA例程:openSSL_internal
我也尝试了npm ursa模块,不幸的是没有成功。
我在使用Java Bouncycastle的客户机和使用Python RSA库的密钥服务器之间交换私钥时遇到了困难。PEM格式用于通过REST传输密钥。keyserver无法解密我提供的密钥(加密密码更改时需要),它需要PKCS#1或PKCS#8密钥和PEM,如下所示: 但是BouncyCastle的输出(使用JCEpeEncryptorBuilder和JcaMiscPEMGenerator)的起
我正在使用JavaScript和Node.js处理一个消息传递项目。创建用户时,服务器使用node.js库生成RSA键区。私钥使用用户密码加密。在webapp上,当用户A向用户B发送消息时,使用用户B的公钥对数据进行加密。当用户B接收到消息时,使用他们的私钥和密码对消息进行解密。 我的问题是,虽然应用程序似乎可以加密数据,但我无法解密数据。抛出的错误消息实际上是“无法解密数据”,这是没有帮助的。
我使用命令“ssh-keygen-t rsa”创建了一个没有密码的公钥,我打算将其用于github,但我错误地发送了公钥和私钥...... 这到底意味着什么?