【问题标题】:RSA public key generation -- SwiftRSA公钥生成——Swift
【发布时间】:2023-09-11 17:11:01
【问题描述】:

Azure 密钥保管库发送 en 参数,它们等于 RSA 模数 (n) 和 RSA public exponent(e强>)。使用 3rd 方库很容易创建,但如果没有模数和指数,输出值将无效。

我需要创建这两个部分的 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()

【问题讨论】:

    标签: ios swift azure encryption rsa


    【解决方案1】:

    所以,我找到了解决方案。不幸的是 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;
    }
    

    此算法与标准 Java KeyFactory 生成类匹配。

    【讨论】:

    • 我试过这个。我试图打印数据,我得到了 140 个字节。有了这个,我怎样才能加密我的字符串?你能指导我吗?
    • 我仍然得到一个错误的数据! iOS11 及以上版本还能用吗?
    最近更新 更多