C#相当于“java.security.spec.rsapublickeyspec”和“java.security.publickey” [英] C# equivalent of “java.security.spec.rsapublickeyspec” and “java.security.publickey”

查看:69
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆