brigitte07 Ответов: 2

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());
			}


Я погуглил" много, но не нашел решения.

Заранее спасибо за вашу помощь.

Что я уже пробовал:

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;
}

2 Ответов

Рейтинг:
8

brigitte07

Эй,
Вот вам и решение.

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)
}


Я надеюсь, что это кому-то поможет


Рейтинг:
2

brigitte07

Эй, большое вам спасибо за ссылку, но я хочу сделать это с помощью DSACryptoServiceProvider, как в Java.