RSA公钥生成-Swift

安东·卡什波尔

Azure密钥保险库发送en参数,这些参数等于RSA模数(n)和RSA公共指数(e)。使用第三方库创建起来很容易,但是如果没有模数和指数,输出值将无效。

我需要创建这两个部分的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()
安东·卡什波尔

因此,我找到了解决方案。不幸的是,SCZ-BasicEncodingRules-iOS对于iOS 8及更高版本的解码算法有误。它输出带有不正确前缀的密钥。

如果您遇到相同的问题,这是一个对我有所帮助的解决方案,但这是Objective-C代码。原始资料

   + (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生成类匹配

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

来自分类Dev

如何使用Swift 3生成RSA公钥和私钥?

来自分类Dev

使用Swift生成base64 url编码的X.509格式2048位RSA公钥?

来自分类Dev

Java Server的Swift RSA加密公钥失败

来自分类Dev

生成RSA公钥/私钥对

来自分类Java

从字符串生成Rsa公钥

来自分类Dev

如何从私钥生成RSA公钥?

来自分类Dev

使用OpenSSL生成RSA公钥/私钥?

来自分类Dev

使用RSA私钥生成公钥?

来自分类Java

RSA公钥导出

来自分类Dev

根据模量和指数生成RSA公钥

来自分类Java

用Java生成的RSA公钥在php中无效

来自分类Dev

使用RSA公钥在Openssl中生成私钥?

来自分类Dev

如何从节点js中的RSA公钥生成SKI?

来自分类Java

从文件加载RSA公钥

来自分类Dev

RSA公钥大小python

来自分类Dev

RSA:在Python和PHP中从n和e生成公钥给我两个不同的公钥

来自分类Java

RSA公钥到Node-Forge公钥

来自分类Dev

使用x509.MarshalPKCS1PublicKey随时生成RSA公钥

来自分类Java

如何读取rsa公钥形式的字符串(由java生成,我想用Python读取)

来自分类Dev

Java中RSA公钥生成和加密的有效实现

来自分类Dev

RSA公钥“ BIT STRING”格式

来自分类Java

从字符串创建RSA公钥

来自分类Linux

openssl / RSA-使用公钥解密

来自分类Java

使用RSA公钥加密AES密钥

来自分类Java

从RSA公钥中提取数据

来自分类Dev

Ruby RSA公钥加密到Golang

来自分类Dev

从Golang证书中获取RSA公钥

来自分类Dev

解析RSA公钥时出错

来自分类Dev

Android中的RSA公钥实现

TOP 榜单

热门标签

归档