Подтвердить что ты не робот

С# Регистрация данных с помощью RSA с помощью BouncyCastle

Кто-нибудь знает простой учебник или примерный код того, как подписать данные в С#, используя bouncy castle. В Java есть тонны учебных пособий и образцов. Я не могу найти ни одного примера в С#. Кто-нибудь знает, как это сделать?

4b9b3361

Ответ 1

Хорошо, я не мог найти документацию о том, как это сделать. Но я все понял. Я вставляю полный код здесь, поэтому, надеюсь, он может помочь кому-то в будущем.

Этот класс будет вычислять RSA-подпись с хэшем sha1 для предоставленной строки и также проверять ее.

using System;
using System.IO;
using System.Text;
using Org.BouncyCastle.Asn1;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.OpenSsl;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.Utilities.Encoders;

namespace API.Crypto
{
    public class RsaSha1Signing
    {
        private RsaKeyParameters MakeKey(String modulusHexString, String exponentHexString, bool isPrivateKey)
        {
            var modulus = new Org.BouncyCastle.Math.BigInteger(modulusHexString, 16);
            var exponent = new Org.BouncyCastle.Math.BigInteger(exponentHexString, 16);

            return new RsaKeyParameters(isPrivateKey, modulus, exponent);
        }

        public String Sign(String data, String privateModulusHexString, String privateExponentHexString)
        {
            /* Make the key */
            RsaKeyParameters key = MakeKey(privateModulusHexString, privateExponentHexString, true);

            /* Init alg */
            ISigner sig = SignerUtilities.GetSigner("SHA1withRSA");

            /* Populate key */
            sig.Init(true, key);

            /* Get the bytes to be signed from the string */
            var bytes = Encoding.UTF8.GetBytes(data);

            /* Calc the signature */
            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 data, String expectedSignature, String publicModulusHexString, String publicExponentHexString)
        {
            /* Make the key */
            RsaKeyParameters key = MakeKey(publicModulusHexString, publicExponentHexString, false);

            /* Init alg */
            ISigner signer = SignerUtilities.GetSigner("SHA1withRSA");

            /* Populate key */
            signer.Init(false, key);

            /* Get the signature into bytes */
            var expectedSig = Convert.FromBase64String(expectedSignature);

            /* Get the bytes to be signed from the string */
            var msgBytes = Encoding.UTF8.GetBytes(data);

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

Ответ 2

Посмотрите на сайт Bouncy Castle. Имеется архив с источниками и примерами. http://www.bouncycastle.org/csharp/download/bccrypto-net-1.7-src-ext.zip

В качестве примеров есть много тестов NUnit. Ниже приведен код метода для шифрования массива байтов данных с использованием алгоритма RSA в качестве образца, но в источниках и тестах Bouncy Castle вы можете найти больше образцов.

    public static byte[] Encrypt(byte[] data, AsymmetricKeyParameter key)
    {
        RsaEngine e = new RsaEngine();
        e.Init(true, key);
        int blockSize = e.GetInputBlockSize();
        List<byte> output = new List<byte>();

        for (int chunkPosition = 0; chunkPosition < data.Length; chunkPosition += blockSize)
        {
            int chunkSize = Math.Min(blockSize, data.Length - (chunkPosition * blockSize));
            output.AddRange(e.ProcessBlock(data, chunkPosition, chunkSize));
        }
        return output.ToArray();
    }

Ответ 3

Вы пробовали Signtool. Этот инструмент будет находиться в папке Microsoft framework.

Ответ 4

.NET не предоставляет алгоритмы шифрования для выбора. И есть много учебников для RSA.

Например.