C#相当于“java.security.spec.rsapublickeyspec”和“java.security.publickey” [英] C# equivalent of “java.security.spec.rsapublickeyspec” and “java.security.publickey”
本文介绍了C#相当于“java.security.spec.rsapublickeyspec”和“java.security.publickey”的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在使用现有Java应用程序的c#开发新版本。
现有应用程序使用DSA加密java.security.spec。*和boncycastle api。
我正在寻找c#中的等效代码,以下代码为java:
< pre lang =java> KeyFactory keyFactory = KeyFactory.getInstance(DSA,SUN);
byte [] encodedPrivateKey = InfosysPrivateKey.getEncodedKey();
PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(encodedPrivateKey);
PrivateKey privateKey = null;
try
{
privateKey = keyFactory.generatePrivate(privateKeySpec);
}
catch(InvalidKeySpecException e)
{
e.printStackTrace();
logger.severe(e.toString());
}
我用google搜索很多但找不到解决方案。
先谢谢你的帮助。
我尝试过:
public static byte [] getKey(Org.BouncyCastle.Asn1.x509.DSAPublicKeyStructure dsaPublicKey)
{
Org.BouncyCastle.Crypto.Parameters.DsaKeyParameters bcKeySpec = new DsaKeyParameters();
DSAParameters keySpec = Org.BouncyCastle.Security.DotNetUtilities.ToDSAParameters(bcKeySpec);
DSACryptoServiceProvider keyFactory = new DSACryptoServiceProvider();
keyFactory.ImportParameters(keySpec);
byte [] pKey = keyFactory.ExportCspBlob(false) ;
返回 pKey;
}
解决方案
Google是你的朋友。
如何在RSACryptoServiceProvider类中使用公钥 [ ^ ]
嘿,
这里的解决方案。
使用 Org.BouncyCastle.Crypto.Generators;
使用 Org.BouncyCastle.Crypto;
使用 Org.BouncyCastle.Pkcs;
使用 Org.BouncyCastle.Asn1.Pkcs;
使用 Org.BouncyCastle.Asn1.X509;
使用 Org.BouncyCastle.X509;
使用 Org.BouncyCastle.Security;
使用 Org.BouncyCastle.Crypto.Parameters;
...
string privateKeyPath = Path.GetDirectoryName(Assembly.GetEntryAssembly()。Location);
string publicKeyPath = Path.GetDirectoryName(Assembly.GetEntryAssembly()。Location);
AsymmetricCipherKeyPair dsaKeyPair = null ;
SecureRandom keyRandom = new SecureRandom();
....
void generateKeysPairs()
{
/ / 生成DSA公钥 - 私钥对
DsaParametersGenerator pGen = new DsaParametersGenerator ();
pGen.Init( 512 , 80 ,keyRandom);
DsaParameters parameters = pGen.GenerateParameters();
IAsymmetricCipherKeyPairGenerator dsaKeyGen = GeneratorUtilities.GetKeyPairGenerator( DSA);
dsaKeyGen.Init( new DsaKeyGenerationParameters(keyRandom,pGen.GenerateParameters()));
dsaKeyPair = dsaKeyGen.GenerateKeyPair();
PrivateKeyInfo privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(dsaKeyPair.Private);
byte [] serializedPrivateBytes = privateKeyInfo.ToAsn1Object()。GetDerEncoded();
string serializedPrivate = Convert.ToBase64String(serializedPrivateBytes);
File.WriteAllText(privateKeyPath,serializedPrivate);
SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(dsaKeyPair.Public);
byte [] serializedPublicBytes = publicKeyInfo.ToAsn1Object()。GetDerEncoded();
);
File.WriteAllText(publicKeyPath,serializedPublic);
DsaPrivateKeyParameters privateKey =(DsaPrivateKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(serializedPrivate));
DsaPublicKeyParameters publicKey =(DsaPublicKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(serializedPublic));
}
void generateSignature()
{
ParametersWithRandom param = new ParametersWithRandom(dsaKeyPair.Private,keyRandom);
// 从字符串中获取要签名的字节
字符串 textToSign = txtBox.Text.Replace( \\ \\ r \\ n, \ n)。替换( \ rr, \\\
跨度>);
byte [] textToSigInByte = Encoding.UTF8.GetBytes(textToSign);
// Init alg
ISigner sig = SignerUtilities.GetSigner ( SHA1withDSA);
// 填充密钥
sig.Init( true ,param);
// Calc签名
sig.BlockUpdate(textToSigInByte, 0 ,textToSigInByte .Length);
byte [] signature = sig.GenerateSignature();
// Base 64对sig进行编码,使其8位干净
var signedString = Convert.ToBase64String(signature);
}
bool verifySignature( string signedString,字符串文本)
{
ISigner sig = SignerUtilities.GetSigner( 带DSA的SHA1跨度>);
byte [] byteText = Convert.FromBase64String(text);
byte [] signedByte = Encoding.UTF8.GetBytes(signedString);
// 填充密钥
sig.Init( false ,dsaKeyPair.Public);
// Calc签名
sig.BlockUpdate(byteText, 0 ,byteText.Length);
// 验证
返回 sig.VerifySignature(signedByte)
}
我希望它可以帮助某人
I'm developing a new version in c# of an existing java application.
The existing application uses DSA encryption with java.security.spec.* and boncycastle api.
I'm looking for equivalent code in c# for the java below code:
<pre lang="java">KeyFactory keyFactory = KeyFactory.getInstance("DSA", "SUN"); byte[] encodedPrivateKey = InfosysPrivateKey.getEncodedKey(); PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(encodedPrivateKey); PrivateKey privateKey = null; try { privateKey = keyFactory.generatePrivate(privateKeySpec); } catch (InvalidKeySpecException e) { e.printStackTrace(); logger.severe(e.toString()); }
I googled" a lot but don't found solution.
Thanks in advance for your help.
What I have tried:
public static byte[] getKey(Org.BouncyCastle.Asn1.x509.DSAPublicKeyStructure dsaPublicKey)
{
Org.BouncyCastle.Crypto.Parameters.DsaKeyParameters bcKeySpec = new DsaKeyParameters();
DSAParameters keySpec = Org.BouncyCastle.Security.DotNetUtilities.ToDSAParameters(bcKeySpec);
DSACryptoServiceProvider keyFactory = new DSACryptoServiceProvider();
keyFactory.ImportParameters(keySpec);
byte[] pKey = keyFactory.ExportCspBlob(false);
return pKey;
}
解决方案
Google is your friend.
how to use a public key with RSACryptoServiceProvider class[^]
Hey,
Here the solution.
using Org.BouncyCastle.Crypto.Generators; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Pkcs; using Org.BouncyCastle.Asn1.Pkcs; using Org.BouncyCastle.Asn1.X509; using Org.BouncyCastle.X509; using Org.BouncyCastle.Security; using Org.BouncyCastle.Crypto.Parameters; ... string privateKeyPath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); string publicKeyPath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); AsymmetricCipherKeyPair dsaKeyPair = null; SecureRandom keyRandom = new SecureRandom(); .... void generateKeysPairs() { //Generate a DSA Public-Private key pair DsaParametersGenerator pGen = new DsaParametersGenerator(); pGen.Init(512, 80, keyRandom); DsaParameters parameters = pGen.GenerateParameters(); IAsymmetricCipherKeyPairGenerator dsaKeyGen = GeneratorUtilities.GetKeyPairGenerator("DSA"); dsaKeyGen.Init(new DsaKeyGenerationParameters(keyRandom, pGen.GenerateParameters())); dsaKeyPair = dsaKeyGen.GenerateKeyPair(); PrivateKeyInfo privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(dsaKeyPair.Private); byte[] serializedPrivateBytes = privateKeyInfo.ToAsn1Object().GetDerEncoded(); string serializedPrivate = Convert.ToBase64String(serializedPrivateBytes); File.WriteAllText(privateKeyPath, serializedPrivate); SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(dsaKeyPair.Public); byte[] serializedPublicBytes = publicKeyInfo.ToAsn1Object().GetDerEncoded(); ); File.WriteAllText(publicKeyPath, serializedPublic); DsaPrivateKeyParameters privateKey = (DsaPrivateKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(serializedPrivate)); DsaPublicKeyParameters publicKey = (DsaPublicKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(serializedPublic)); } void generateSignature() { ParametersWithRandom param = new ParametersWithRandom(dsaKeyPair.Private, keyRandom); //Get the bytes to be signed from the string String textToSign = txtBox.Text.Replace("\r\n", "\n").Replace("\r", "\n"); byte[] textToSigInByte = Encoding.UTF8.GetBytes(textToSign); // Init alg ISigner sig = SignerUtilities.GetSigner("SHA1withDSA"); //Populate key sig.Init(true, param); // Calc the signature sig.BlockUpdate(textToSigInByte , 0, textToSigInByte .Length); byte[] signature = sig.GenerateSignature(); // Base 64 encode the sig so its 8-bit clean var signedString = Convert.ToBase64String(signature); } bool verifySignature(string signedString , String text) { ISigner sig = SignerUtilities.GetSigner("SHA1withDSA"); byte[] byteText= Convert.FromBase64String(text); byte[] signedByte= Encoding.UTF8.GetBytes(signedString); //Populate key sig.Init(false, dsaKeyPair.Public); // Calc the signature sig.BlockUpdate(byteText, 0, byteText.Length); // verify return sig.VerifySignature(signedByte) }
I hope it will help someone
这篇关于C#相当于“java.security.spec.rsapublickeyspec”和“java.security.publickey”的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文