Как Вы проверяете подпись RSA SHA1 в Python?

Вот пример того, как Python (динамически типизированный) и Go (статически типизированный) обрабатывают ошибку типа:

def silly(a):
    if a > 0:
        print 'Hi'
    else:
        print 5 + '3'

Python проверяет тип во время выполнения и, следовательно:

silly(2)

Выполняется отлично и производит ожидаемый выход Hi. Ошибка возникает только при попадании проблемной строки:

silly(-1)

Производит

TypeError: unsupported operand type(s) for +: 'int' and 'str'

, потому что соответствующая строка была фактически выполнена.

С другой стороны, проверяет тип во время компиляции:

package main

import ("fmt"
)

func silly(a int) {
    if (a > 0) {
        fmt.Println("Hi")
    } else {
        fmt.Println("3" + 5)
    }
}

func main() {
    silly(2)
}

Вышеуказанное не будет компилироваться со следующей ошибкой:

invalid operation: "3" + 5 (mismatched types string and int)
29
задан Andrew B. 13 February 2009 в 01:50
поделиться

5 ответов

Данные между маркерами являются кодированием base64 DER-кодирования ASN.1 PKCS#8 PublicKeyInfo, содержащего PKCS#1 RSAPublicKey.

, Который является большим количеством стандартов, и Вы будете лучше всего обслуживаться с использованием crypto-библиотеки для декодирования его (такие как M2Crypto как предложенный joeforker). Рассматривайте следующее как некоторую забавную информацию о формате:

, Если Вы хотите, можно декодировать его как это:

Base64-декодируют строку:

30819f300d06092a864886f70d010101050003818d0030818902818100df1b822e14eda1fcb74336
6a27c06370e6cad69d4116ce806b3d117534cf0baa938c0f8e4500fb59d4d98fb471a8d01012d54b
32244197c7434f27c1b0d73fa1b8bae55e70155f907879ce9c25f28a9a92ff97de1684fdaff05dce
196ae76845f598b328c5ed76e0f71f6a6b7448f08691e6a556f5f0d773cb20d13f629b6391020301
0001

Это - DER-кодирование:

   0 30  159: SEQUENCE {
   3 30   13:   SEQUENCE {
   5 06    9:     OBJECT IDENTIFIER rsaEncryption (1 2 840 113549 1 1 1)
  16 05    0:     NULL
            :     }
  18 03  141:   BIT STRING 0 unused bits, encapsulates {
  22 30  137:       SEQUENCE {
  25 02  129:         INTEGER
            :           00 DF 1B 82 2E 14 ED A1 FC B7 43 36 6A 27 C0 63
            :           70 E6 CA D6 9D 41 16 CE 80 6B 3D 11 75 34 CF 0B
            :           AA 93 8C 0F 8E 45 00 FB 59 D4 D9 8F B4 71 A8 D0
            :           10 12 D5 4B 32 24 41 97 C7 43 4F 27 C1 B0 D7 3F
            :           A1 B8 BA E5 5E 70 15 5F 90 78 79 CE 9C 25 F2 8A
            :           9A 92 FF 97 DE 16 84 FD AF F0 5D CE 19 6A E7 68
            :           45 F5 98 B3 28 C5 ED 76 E0 F7 1F 6A 6B 74 48 F0
            :           86 91 E6 A5 56 F5 F0 D7 73 CB 20 D1 3F 62 9B 63
            :           91
 157 02    3:         INTEGER 65537
            :         }
            :       }
            :   }

Для ключа RSA на 1 024 бита, можно рассматривать "30819f300d06092a864886f70d010101050003818d00308189028181" как постоянный заголовок, сопровождаемый на 00 байтов, сопровождаемых на 128 байтов модуля RSA. После этого 95% времени Вы доберетесь 0203010001, который показывает общедоступную экспоненту RSA 0x10001 = 65537.

можно использовать те два значения в качестве n и e в кортеже для построения RSAobj.

24
ответ дан Community 14 October 2019 в 08:02
поделиться

Используйте M2Crypto. Вот то, как проверить для RSA и любого другого алгоритма, поддерживаемого OpenSSL:

pem = """-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDfG4IuFO2h/LdDNmonwGNw5srW
nUEWzoBrPRF1NM8LqpOMD45FAPtZ1NmPtHGo0BAS1UsyJEGXx0NPJ8Gw1z+huLrl
XnAVX5B4ec6cJfKKmpL/l94WhP2v8F3OGWrnaEX1mLMoxe124Pcfamt0SPCGkeal
VvXw13PLINE/YptjkQIDAQAB
-----END PUBLIC KEY-----""" # your example key

from M2Crypto import BIO, RSA, EVP
bio = BIO.MemoryBuffer(pem)
rsa = RSA.load_pub_key_bio(bio)
pubkey = EVP.PKey()
pubkey.assign_rsa(rsa)

# if you need a different digest than the default 'sha1':
pubkey.reset_context(md='sha1')
pubkey.verify_init()
pubkey.verify_update('test  message')
assert pubkey.verify_final(signature) == 1
29
ответ дан joeforker 14 October 2019 в 08:02
поделиться

Возможно, это не ответ, который Вы ищете, но если все, в чем Вы нуждаетесь, должно превратить ключ в биты, похоже, что это - закодированный Base64. Посмотрите codecs модуль (я думаю) в стандартной библиотеке Python.

0
ответ дан David Z 14 October 2019 в 08:02
поделиться

я думаю ezPyCrypto, мог бы сделать это немного легче. Высокоуровневые методы ключ класс включает эти два метода, которые я надеюсь, решит Вашу проблему:

  • verifyString - проверяет, что строка против подписи
  • importKey - импортирует открытый ключ (и возможно закрытый ключ также)

Rasmus указывает в комментариях, что verifyString трудно кодируется для использования MD5, в этом случае ezPyCryto не может помочь Andrew, если он не пробирается в его код. Я подчиняюсь ответ joeforker : рассмотрите M2Crypto.

1
ответ дан Community 14 October 2019 в 08:02
поделиться

Открытый ключ содержит обоих модуль (очень длинное количество, могут быть 1024 бита, 2058 битов, 4096 битов) и экспонента с открытым ключом (намного меньшее число, обычно равняется еще одному, чем два к некоторому питанию). Необходимо узнать, как разделить тот открытый ключ на эти два компонента, прежде чем можно будет сделать что-либо с ним.

я не знаю много о pycrypto, но проверить подпись, взять хеш строки. Теперь мы должны дешифровать подпись. Читайте на модульное возведение в степень ; формула для дешифрования подписи message^public exponent % modulus. Последний шаг должен проверить, если хеш, который Вы сделали и дешифрованная подпись, которую Вы получили, то же.

2
ответ дан user64349 14 October 2019 в 08:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: