2014-10-21 2 views
1

Hei Guys,RSA는 키보다 긴 문자열을 암호화합니다.

저는 JS와 공개 키로 문자열을 암호화하고 있습니다. JSBN 코드를 사용하지만 BigInt를 만드는 데 문제가 있습니다.

RSA.js을 수행합니다

// Copyright (c) 2005 Tom Wu 
var m = pkcs1pad2(text,(this.n.bitLength()+7)>>3); // getting the Bigint 
if(m == null) return null; // nullcheck 
var c = this.doPublic(m); // encrypting the BigInt 

문제는 "pkcs1pad2"입니다. 이 함수는 텍스트의 길이가 더 길면 키의 BitLength를 확인합니다. 그렇다면 BigInt를 생성하고 리턴하십시오.

// Copyright (c) 2005 Tom Wu 
if(n < s.length + 11) { // TODO: fix for utf-8 
    alert("Message too long for RSA"); 
    return null; 
} 
var ba = new Array(); 
var i = s.length - 1; 
while(i >= 0 && n > 0) { 
    var c = s.charCodeAt(i--); 
    if(c < 128) { // encode using utf-8 
    ba[--n] = c; 
    } else if((c > 127) && (c < 2048)) { 
    ba[--n] = (c & 63) | 128; 
    ba[--n] = (c >> 6) | 192; 
    } else { 
    ba[--n] = (c & 63) | 128; 
    ba[--n] = ((c >> 6) & 63) | 128; 
    ba[--n] = (c >> 12) | 224; 
    } 
} 
ba[--n] = 0; 
var rng = new SecureRandom(); 
var x = new Array(); 
while(n > 2) { // random non-zero pad 
    x[0] = 0; 
    while(x[0] == 0) rng.nextBytes(x); 
    ba[--n] = x[0]; 
} 
ba[--n] = 2; 
ba[--n] = 0; 
return new BigInteger(ba); 

작성자가 "// TODO : fix for utf-8"로 무엇을 의미하는지 알 수 없습니다. 아무도 이것을 설명 할 수 있습니까? &/답변을 드릴까요?

+0

입력 데이터에 패딩을 수행하는 것은 RSA의 일부가 아닙니다. 나는 pkcs1pad2 함수가 내가 잘못하지 않았다면 crypted 파일에 공개 키를 추가한다고 생각한다. – fathyb

+0

@fathyb 나는 그가 정확히 무엇을 하려는지 아니,이 함수는 bigint를 생성하는지 정확히 알지 못한다. "doPublic"이 암호화 된 바이트 배열을 반환하기 때문에 "// PKCS # 1 (type 2, random) 입력 문자열을 n 바이트까지 채우고 bigint를 반환합니다." – SEUH

답변

2

PKCS#1에 정의 된대로 PKCS # 1 v1.5 패딩을 구현하려고합니다. 암호화 must be 11 bytes smaller than the size of the modulus위한 PKCS # 1 v1.5에 패딩의 입력 :

M : 메시지 길이 mLen, 의 옥텟 스트링을 암호화 할 mLen < = K - 11

경우] 메시지가 크면 RSA 암호화를 계속할 수 없습니다. 일반적으로 문제가되지 않습니다. 임의의 키로 대칭 암호를 사용하여 암호화 한 다음 RSA를 사용하여 해당 임의의 키를 암호화합니다. 이를 hybrid cryptosystem이라고합니다.

코멘트가있는 이유는 많은 스크립팅 언어와 마찬가지로 JavaScript가 바이트와 텍스트를 구별하는 데 약간의 문제가 있다는 것입니다. s이 텍스트이면 s.length은 바이트가 아닌 문자 양을 반환 할 가능성이 높습니다. 이는 weak typing을 구현하는 언어에 대해 고의적이지만 JavaScript에서 암호화 알고리즘을 쉽게 만들고 사용할 수는 없습니다.

UTF-8과 같은 멀티 바이트 인코딩을 사용하는 경우 2 바이트로 인코딩하는 문자는 총 평문 크기 (바이트)를 증가시킵니다. 따라서 계산이 실패 할 수도 있습니다. 어느 쪽이든, 또는 단일 바이트로 인코딩 할 수없는 문자가 풀릴 것입니다. ASCII (7 비트, 값 0..127) 범위를 벗어날 경우 발생할 가능성이있는 코드를 간략하게 살펴보면 문자.

관련 문제