c# verschlüsseln string - Signieren von Daten mit MD5WithRSA aus .Pem / .Pkcs8-Schlüsseldatei in C #




3 Answers

Ich stoße auf ein sehr ähnliches Problem beim Versuch, ein natives C # -Tool zum Packen von Chrome-Erweiterungen zu erstellen (mit SHA1, nicht MD5, aber das ist kein großer Unterschied). Ich glaube, ich habe buchstäblich jede mögliche Lösung für .Net: System.Security.Cryptography, BouncyCastle, OpenSSL.Net und Chilkat RSA versucht.

Die beste Lösung ist wahrscheinlich Chilkat; ihre Schnittstelle ist die sauberste und einfachste, sie ist gut unterstützt und gut dokumentiert, und es gibt eine Million Beispiele. Zum Beispiel ist hier ein Code, der ihre Bibliothek verwendet, die etwas sehr nahe an dem was du willst: http://www.example-code.com/csharp/rsa_signPkcs8.asp . Allerdings ist es nicht kostenlos (obwohl $ 150 nicht unvernünftig ist, da ich 2 Tage verbrannte, um das herauszufinden, und ich mache ein bisschen mehr als $ 75 pro Tag!).

Als kostenlose Alternative bietet JavaScience unter http://www.jensign.com/JavaScience/cryptoutils/index.html eine Reihe von Crypto-Dienstprogrammen in Quellform für mehrere Sprachen (einschließlich C # /. Net) an. Das, was am meisten hervorsticht, was Sie versuchen, ist opensslkey ( http://www.jensign.com/opensslkey/index.html ), mit dem Sie einen RSACryptoServiceProvider aus einer .pem-Datei generieren können. Sie können diesen Anbieter dann verwenden, um Ihren Code zu signieren:

        string pemContents = new StreamReader("pkcs8privatekey.pem").ReadToEnd();
        var der = opensslkey.DecodePkcs8PrivateKey(pemContents);
        RSACryptoServiceProvider rsa = opensslkey.DecodePrivateKeyInfo(der);

        signature = rsa.SignData(data, new MD5CryptoServiceProvider());
aes decrypt

Ich habe das folgende Codebeispiel in Java, und ich muss es in C # nachspielen:

PKCS8EncodedKeySpec privKeySpec = new PKCS8EncodedKeySpec(pkcs8PrivateKey);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privKey = keyFactory.generatePrivate(privKeySpec);
Signature sign = Signature.getInstance("MD5withRSA");

sign.initSign(privKey);
sign.update(data);
byte[] signature = sign.sign();

Ist es möglich mit der Standard-.Net-Crypto-API, oder sollte ich BouncyCastle verwenden? Vielen Dank,

b.




Diese SO-Frage beantwortet den PKCS # 8-Teil Ihres Codes. Der Rest der .NET RSA-Klassen ist ein bizarres Durcheinander von teilweise überlappenden Klassen, die sehr schwer zu ergründen sind. Es scheint, dass die Signaturunterstützung in den Klassen RSACryptoServiceProvider und / oder RSAPKCS1SignatureFormatter liegt.




Sie können diesen Code verwenden. Zuallererst sollten Sie "BouncyCastle.Crypto.dll" von http://www.bouncycastle.org/csharp/ herunterladen.

/// <summary>
/// MD5withRSA Signing
/// https://www.vrast.cn
/// keyle_xiao 2017.1.12
/// </summary>
public class MD5withRSASigning
{
    public Encoding encoding = Encoding.UTF8;
    public string SignerSymbol = "MD5withRSA";

    public MD5withRSASigning() { }

    public MD5withRSASigning(Encoding e, string s)
    {
        encoding = e;
        SignerSymbol = s;
    }

    private AsymmetricKeyParameter CreateKEY(bool isPrivate, string key)
    {
        byte[] keyInfoByte = Convert.FromBase64String(key);

        if (isPrivate)
            return PrivateKeyFactory.CreateKey(keyInfoByte);
        else
            return PublicKeyFactory.CreateKey(keyInfoByte);
    }

    public string Sign(string content, string privatekey)
    {
        ISigner sig = SignerUtilities.GetSigner(SignerSymbol);

        sig.Init(true, CreateKEY(true, privatekey));

        var bytes = encoding.GetBytes(content);

        sig.BlockUpdate(bytes, 0, bytes.Length);
        byte[] signature = sig.GenerateSignature();


        /* Base 64 encode the sig so its 8-bit clean */
        var signedString = Convert.ToBase64String(signature);

        return signedString;
    }

    public bool Verify(string content, string signData, string publickey)
    {
        ISigner signer = SignerUtilities.GetSigner(SignerSymbol);

        signer.Init(false, CreateKEY(false, publickey));

        var expectedSig = Convert.FromBase64String(signData);

        /* Get the bytes to be signed from the string */
        var msgBytes = encoding.GetBytes(content);

        /* Calculate the signature and see if it matches */
        signer.BlockUpdate(msgBytes, 0, msgBytes.Length);
        return signer.VerifySignature(expectedSig);
    }
}



Related