2017-04-26 186 views
4

天青鍵保管庫發送Ë和其等於RSA模量(Ñ)和RSA公共指數(ËÑ參數。使用第三方庫很容易創建,但如果沒有模數和指數,輸出值將無效。RSA公共密鑰生成 - SWIFT

我需要創建這兩個部分的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-COriginal 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; 
} 

該算法與標準的Java 的KeyFactory代班相匹配。

+0

我試過這個。我試圖打印數據,我有140字節。有了這個,我如何加密我的字符串?你能指導我嗎? –

+0

我仍然得到一個錯誤的數據!它還在iOS11及更高版本上工作嗎? – Rudi