2017-01-11 4 views
-1

죄송합니다, 내 멍청한 질문, 나는이 분야에서 새로운데 (하지만 나는 호기심이 많습니다). DATA와 SIGNATURE라는 두 개의 필드가있는 xml 파일을 찾았습니다. DATA는 ASCII 텍스트이며 SIGNATURE는 256 개의 16 진 문자 (128 바이트)로 구성된 SHA1-RSA1024 문자열입니다. 데이터 필드에서 해당 서명을 얻은 방법을 이해할 수 없습니다. RSA로 데이터를 작성한 다음 SHA로 데이터를 새로 작성하거나 그 반대입니다. 나는 RSA를 공부하고 나는 이런 식으로 뭔가를 발견해야한다고 생각 :SHA-RSA는 어떻게 작동합니까?

00 01 FF FF .. FF FF 00 DigestInfo MessageDigest 

을하지만 그것은 사실이 아니다 : 내 서명 데이터가 해당 문자열이 포함되어 있지 않습니다. 서명을 얻는 절차를 설명해 주시겠습니까? 예를 들어 링크가 있습니까? (어쩌면 파이썬에서 그 단순성 때문에)?

+0

다음을보십시오. http://security.stackexchange.com/questions/9260/sha-rsa-and-the-relation-between-them – JaggenSWE

답변

1

security.stackexchange.com answer은 꽤 좋은 내용을 가지고 있지만, 여기가 매우 귀하의 질문에 대답에 보이지 않기 때문에 (짧은 형식입니다.

첫 번째 단계는 M이 (해시되지 않은) 메시지입니다 EMSA-PKCS1-v1_5하고있다 emLen 우리는 Hash는 (문제로) SHA-1 알고있다.

H = Hash(M). (일반적으로 비트 표시)는 RSA 키의 크기 (바이트)이므로, 출력은 20 바이트입니다. 현실을 가정 해 봅시다 생산 된 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20.

구조체 T :

// DigestInfo = SEQUENCE(AlgorithmIdentifier, OCTET STRING) 
30 21 
    // AlgorithmIdentifier = SEQUENCE(OBJECT IDENTIFIER, ANY) 
    30 09 
     // OBJECT IDENTIFIER(SHA1) => OBJECT IDENTIFIER(1.3.14.3.2.26) 
     06 05 2B 0E 03 02 1A 
     // NULL (SHA-1 has no parameters) 
     05 00 
    // OCTET STRING(H) 
    04 14 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 

이러한 구조의 모든 고정하고 있기 때문에 값 (SHA-1 OID) 및/또는 길이 (H = 20 바이트) T는 그냥 (30 21 30 09 06 05 2B 0E 03 02 1A 05 00 04 14 CONCAT H) (SHA-위한 1).

2048 비트 키 (256 바이트)가 있다고 가정 해 보겠습니다. tLen = 35, emLen> tLen + 11이므로, 진행하는 것이 좋습니다.

이제 PS을 빌드하십시오. emLen - tLen - 3FF입니다. RSA-2048이있는 SHA-1의 경우 218 FF 시퀀스를 의미합니다. 당신이 맨 끝에, 해시 출력은 여전히 ​​볼 수 있습니다 볼 수 있듯이

EM = 00 01 PS 00 T 

이제 모든 것을 함께 붙이기, 우리는

00 01 FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
FF FF FF FF FF FF FF FF FF FF FF FF 00 30 21 30 
09 06 05 2B 0E 03 02 1A 05 00 04 14 20 20 20 20 
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 

(SHA-1 및 2048 비트 키) 얻을. EMSA-PKCS1-v1_5 패딩 구조가 예상 한 것 같습니다.

이어서, EM는 서명을 생성하기 위해 RSA 개인 키 화학식 통해인가 얻는다 :

`signature` = MODPOW(`EM`, `d`, `n`) 

signature의 값이 현재 고정 된 예는 소정 수 없다 d (비밀 키)에 의존하기 때문이다. 그러나이 마지막 단계는 a) 암호 학적으로 건전하고 b) 더 이상 서명 값 내에서 MessageDigest 값을 찾을 수없는 이유입니다.RSA에 대한

는 서명이

`candidate` = MODPOW(`signature`, `e`, `n`) 
return ConstantTimeSequenceEquals(`candidate`, `EM`); 

새로운 RSA 서명 알고리즘 (PSS (확률 서명 방식))로 확인 된 매우 다르게 작동됩니다 시그니처. DSA와 ECDSA는 훨씬 더 다르게 작동합니다.