Различные цифровые подписи, созданные разными технологиями подписи - PullRequest
1 голос
/ 15 декабря 2011

У меня есть такой вход:

  • Дайджест (sha1).
  • Сертификат X509, изготовленный инструментом makecert. Таким образом, алгоритм открытого ключа - sha1WithRsa.
  • Закрытый ключ для сертификата, также сделанный инструментом makecert.

Я хочу подписать дайджест с помощью алгоритма подписи rsa. Я использовал следующие технологии подписи:

  • Мой собственный подписант (на самом деле с помощью Microsoft Strong Crypto Provider)
  • BouncyCastle
  • Openssl

Каждый генерирует и проверяет штраф подписи. Но у меня есть 3 разные подписи в качестве вывода. Я пробовал это много раз. И эти подписи не случайны. Я получаю 3 постоянных разных подписей. Как это может быть? У кого-нибудь была такая проблема? Я неправ в чем-то?

Обновление
Значения Base64:

Хеш:
XN9ADbe4NVnSscjRGvBnWe1bDaw =

Подпись MySigner ':
aRiRJgYmFKl8i8 + FTUbr8Ah9sWybNw2XyFLVttaxrWzhj14nRuyL5qSXxaL4 / B0etKZQH5qipZB04wx8 + aoRnnHxNcLFddyxMk7aUmilo + 58k4KyyK43qgyUOmPs6mWvmBHpDf0pcU6FrRiMB543pnYqBZGfmAlfG + Yjjdxbqw4 =

Подпись BouncyCastle ':
WP1iU2nuooneikMLCaWR9i03B + ISp8 + Р + С / OqYHNF0qGioIbaRWCPHhxJqhCJdayr6T / X2XPjE2XebITmSmnd4JQgyECK77ju7AxCgBxIAWvzwDFMrrFvQ05wt8KDiDbcnfrRKZK + CMF / SvyBwBdezGuCQ3mXu7joo5l9LxQrM4 =

подпись Openssl:
ЛРК / кЙ / + 1vUmHLIKNmZy5h84K2ryu9GtfIp2XXeTsJJz96i7tqNg + EU / c9KkRhcbf4kFMt / O8HLLp9nNSrm5VafNCrPTmOWJMfRrRZxH1BR8sjqmITTSJOy6kNvkmHcrrwWehcfaBw8ItHp / 2 + m8NY5C / QL4W7hL8qt5KoN3q5E =

Обновление
Файлы с байтами http://download.files.namba.kg/files/5637461

Обновление
Код для подписи дайджеста с BouncyCastle

        public void SignWithBouncyCastle()
    {
        byte[] digest = File.ReadAllBytes(@"d:\public\signatures\digest");
        byte[] signature = null;
        TextReader textReader = new StreamReader(@"e:\PresentCert\RootCATest2.pem"); // file with private key and public key
        PemReader pemReader = new PemReader(textReader);
        object obj = pemReader.ReadObject();
        AsymmetricCipherKeyPair ackp;
        ackp = (AsymmetricCipherKeyPair)obj;
        RsaDigestSigner signer = new RsaDigestSigner(new Sha1Digest());

        signer.Init(true, ackp.Private);
        signer.BlockUpdate(digest, 0, digest.Length);
        signature = signer.GenerateSignature();

        signer.Init(false, ackp.Public);
        signer.BlockUpdate(digest, 0, digest.Length);
        bool r = signer.VerifySignature(signature);
        // r is true
        File.WriteAllBytes(@"d:\public\signatures\bouncycastle", signature);
    }

Затем я проверяю подпись с openssl, используя команду:

openssl rsautl -verify -inkey e:\PresentCert\pubRootCATest2.pem -pubin -in d:\public\signatures\bouncycastle -out verified

И сравни файлы

comp verified d:\public\signatures\bouncycastle

Они разные.

Обновление
Исправленный код

        public void SignMessageWithBouncyCastle()
    {
        //File.WriteAllBytes(@"c:\msg", Encoding.UTF8.GetBytes("the_secret_message"));
        byte[] msg = File.ReadAllBytes(@"c:\msg");
        byte[] signature = null;
        TextReader textReader = new StreamReader(@"e:\PresentCert\RootCATest2.pem"); // file with private key and public key
        PemReader pemReader = new PemReader(textReader);
        object obj = pemReader.ReadObject();
        AsymmetricCipherKeyPair ackp;
        ackp = (AsymmetricCipherKeyPair)obj;
        RsaDigestSigner signer = new RsaDigestSigner(new Sha1Digest());

        signer.Init(true, ackp.Private);
        signer.BlockUpdate(msg, 0, msg.Length);
        signature = signer.GenerateSignature();

        signer.Init(false, ackp.Public);
        signer.BlockUpdate(msg, 0, msg.Length);
        bool r = signer.VerifySignature(signature);
        // r is true
        File.WriteAllBytes(@"c:\bouncycastle", signature);
    }

И на этот раз я использовал эту команду openssl:

openssl dgst -sha1 -verify c:\pubRootCATest2.pem -signature c:\bouncycastle c:\msg

И результат был подтвержден ОК!

1 Ответ

2 голосов
/ 15 декабря 2011

Вы используете RSA PSS . Существует более одной действительной подписи.

...