2017-04-26 4 views
4

푸른 키 볼트는 전자와 RSA 모듈러스 (N )와 RSA 공개 지수 (E )를 동일 N 파라미터를 전송한다. 타사 라이브러리를 사용하여 쉽게 만들 수 있지만 모듈러스 및 지수가 없으면 출력 값이 유효하지 않습니다.RSA 공개 키 생성 - 스위프트

이 두 부분의 RSA 공개 키를 만들어야합니다. 그러면 RSA OAEP를 만들어야합니다. 비슷한 문제가 발생 했나요? 이 아이디어를 어떻게 얻을 수 있을까요?

SCZ-BasicEncodingRules-iOS을 사용해 보았지만 잘못된 코드가 출력되었습니다.

let moduleString: String = "mK-g0TLMqtefmosgBSTQi3dWh8h-rn4lQA8sQgNs_Gkf5TvgKWtYGJ4jRGUU-eK2bmyAAomVUojYBBlRYBkTRekm99DlD9T6U9yI3v11pZVl3yQgVXBEkiTZug3Inn_IAOGPQ3Q5OT6fEj1sRRxmMv93CQukQguSKuU4v2tmElgvyhg_eKIQbNx0JRCI4-1Z5GazxNjtwk7tWcA6PAbV0zZe2AaW0TlYVil_U8NckgHBguBoTHqVAbzb-MNa-HRa4QlBmdemcSaiDr5GikoOdmQ1-Lu6koqUkepx16pgqPvVw3o_NuXAZCS37c7bfgtXWTJcAIjiQaEyRcIV2bXsUQ" 

    let exponent: String = "AQAB" 

    let moduleData: NSData! = (moduleString 
     as NSString).dataUsingEncoding(NSUTF8StringEncoding) as NSData! 
    let expData: NSData! = (exponent 
     as NSString).dataUsingEncoding(NSUTF8StringEncoding) as NSData! 
    let arrayaaa: NSArray = [moduleData, expData] 
    let key: NSData = arrayaaa.berData() 

답변

2

그래서, 나는 해결책을 발견 : 여기

는 코드입니다. 불행하게도 SCZ-BasicEncodingRules-iOS에는 iOS 8 이상에서 잘못된 디코딩 알고리즘이 있습니다. 잘못된 접두사가있는 키를 출력합니다.

동일한 문제가 발생하는 경우 여기 나를 도운 해결책이 있지만 Objective-C 코드입니다. Original source :

+ (NSData *)generateRSAPublicKeyWithModulus:(NSData*)modulus exponent:(NSData*)exponent 
{ 
    const uint8_t DEFAULT_EXPONENT[] = {0x01, 0x00, 0x01,}; //default: 65537 
    const uint8_t UNSIGNED_FLAG_FOR_BYTE = 0x81; 
    const uint8_t UNSIGNED_FLAG_FOR_BYTE2 = 0x82; 
    const uint8_t UNSIGNED_FLAG_FOR_BIGNUM = 0x00; 
    const uint8_t SEQUENCE_TAG = 0x30; 
    const uint8_t INTEGER_TAG = 0x02; 

    uint8_t* modulusBytes = (uint8_t*)[modulus bytes]; 
    uint8_t* exponentBytes = (uint8_t*)(exponent == nil ? DEFAULT_EXPONENT : [exponent bytes]); 

    //(1) calculate lengths 
    //- length of modulus 
    int lenMod = (int)[modulus length]; 
    if(modulusBytes[0] >= 0x80) 
     lenMod ++; //place for UNSIGNED_FLAG_FOR_BIGNUM 
    int lenModHeader = 2 + (lenMod >= 0x80 ? 1 : 0) + (lenMod >= 0x0100 ? 1 : 0); 
    //- length of exponent 
    int lenExp = exponent == nil ? sizeof(DEFAULT_EXPONENT) : (int)[exponent length]; 
    int lenExpHeader = 2; 
    //- length of body 
    int lenBody = lenModHeader + lenMod + lenExpHeader + lenExp; 
    //- length of total 
    int lenTotal = 2 + (lenBody >= 0x80 ? 1 : 0) + (lenBody >= 0x0100 ? 1 : 0) + lenBody; 

    int index = 0; 
    uint8_t* byteBuffer = malloc(sizeof(uint8_t) * lenTotal); 
    memset(byteBuffer, 0x00, sizeof(uint8_t) * lenTotal); 

    //(2) fill up byte buffer 
    //- sequence tag 
    byteBuffer[index ++] = SEQUENCE_TAG; 
    //- total length 
    if(lenBody >= 0x80) 
     byteBuffer[index ++] = (lenBody >= 0x0100 ? UNSIGNED_FLAG_FOR_BYTE2 : UNSIGNED_FLAG_FOR_BYTE); 
    if(lenBody >= 0x0100) 
    { 
     byteBuffer[index ++] = (uint8_t)(lenBody/0x0100); 
     byteBuffer[index ++] = lenBody % 0x0100; 
    } 
    else 
     byteBuffer[index ++] = lenBody; 
    //- integer tag 
    byteBuffer[index ++] = INTEGER_TAG; 
    //- modulus length 
    if(lenMod >= 0x80) 
     byteBuffer[index ++] = (lenMod >= 0x0100 ? UNSIGNED_FLAG_FOR_BYTE2 : UNSIGNED_FLAG_FOR_BYTE); 
    if(lenMod >= 0x0100) 
    { 
     byteBuffer[index ++] = (int)(lenMod/0x0100); 
     byteBuffer[index ++] = lenMod % 0x0100; 
    } 
    else 
     byteBuffer[index ++] = lenMod; 
    //- modulus value 
    if(modulusBytes[0] >= 0x80) 
     byteBuffer[index ++] = UNSIGNED_FLAG_FOR_BIGNUM; 
    memcpy(byteBuffer + index, modulusBytes, sizeof(uint8_t) * [modulus length]); 
    index += [modulus length]; 
    //- exponent length 
    byteBuffer[index ++] = INTEGER_TAG; 
    byteBuffer[index ++] = lenExp; 
    //- exponent value 
    memcpy(byteBuffer + index, exponentBytes, sizeof(uint8_t) * lenExp); 
    index += lenExp; 

    if(index != lenTotal) 
     NSLog(@"lengths mismatch: index = %d, lenTotal = %d", index, lenTotal); 

    NSMutableData* buffer = [NSMutableData dataWithBytes:byteBuffer length:lenTotal]; 
    free(byteBuffer); 

    return buffer; 
} 

이 알고리즘은 표준 자바 KeyFactory에 세대 클래스와 일치합니다.

+0

나는 이것을 시도했다. 나는 데이터를 인쇄하려고했는데 140 바이트를 얻었다. 이걸 사용하면 어떻게 문자열을 암호화 할 수 있습니까? 이걸 안내 할 수 있니? –

+0

나는 여전히 잘못된 데이터를 얻습니다! 여전히 iOS11 이상에서 작동합니까? – Rudi