iphone - 如何在 iPhone/Objective C 上找出 RSA 公钥的模数和指数

标签 iphone objective-c cocoa-touch encryption rsa

是否有可能找出使用 SecKeyGeneratePair(一般的安全框架)创建的公钥的模数和指数?

最佳答案

我对此一头雾水,但这是我找到的解决方案(不使用任何外部包)。

首先,转到 Apple 的 CryptoExercise 示例。从那里下载“SecKeyWrapper”类。该类中有趣的函数是 getPublicKeyBits。

示例链接:http://developer.apple.com/library/ios/#samplecode/CryptoExercise/Introduction/Intro.html

您将收到的位是包含模数和 exp 的 DER 编码(wiki it)公钥。这是一个可以为您解码的代码,非常简单:

- (NSData *)getPublicKeyExp
{
    NSData* pk = [self getPublicKeyBits];
    if (pk == NULL) return NULL;

    int iterator = 0;

    iterator++; // TYPE - bit stream - mod + exp
    [self derEncodingGetSizeFrom:pk at:&iterator]; // Total size

    iterator++; // TYPE - bit stream mod
    int mod_size = [self derEncodingGetSizeFrom:pk at:&iterator];
    iterator += mod_size;

    iterator++; // TYPE - bit stream exp
    int exp_size = [self derEncodingGetSizeFrom:pk at:&iterator];

    return [pk subdataWithRange:NSMakeRange(iterator, exp_size)];
}

- (NSData *)getPublicKeyMod
{
    NSData* pk = [self getPublicKeyBits];
    if (pk == NULL) return NULL;

    int iterator = 0;

    iterator++; // TYPE - bit stream - mod + exp
    [self derEncodingGetSizeFrom:pk at:&iterator]; // Total size

    iterator++; // TYPE - bit stream mod
    int mod_size = [self derEncodingGetSizeFrom:pk at:&iterator];

    return [pk subdataWithRange:NSMakeRange(iterator, mod_size)];
}

- (int)derEncodingGetSizeFrom:(NSData*)buf at:(int*)iterator
{
    const uint8_t* data = [buf bytes];
    int itr = *iterator;
    int num_bytes = 1;
    int ret = 0;

    if (data[itr] > 0x80) {
        num_bytes = data[itr] - 0x80;
        itr++;
    }

    for (int i = 0 ; i < num_bytes; i++) ret = (ret * 0x100) + data[itr + i];

    *iterator = itr + num_bytes;
    return ret;
}

关于iphone - 如何在 iPhone/Objective C 上找出 RSA 公钥的模数和指数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3840005/

相关文章:

ios - iOS 8 是否包含面向开发人员的 NFC SDK?

iphone - 获取 NSData 中的 json

android - 适用于 android 和 iphone 的 RabbitMQ 或 ActiveMQ

iphone - 批准后修改应用公司的名称

ios - CGContextDrawPath 只描边不填充

objective-c - 将元素放入部分数组的大条件,更好的方法吗? - Objective-C

ios - viewForAnnotation 详细披露更改当前位置以及引脚

iphone - 如何使用 NSURLRequest 在 Http 请求中发送 json 数据

ios - 访问 "Events Found in Mail"日历中的事件

ios - 以编程方式将 UICollectionViewCell 设置为 Selected 但 indexPathsForSelectedItems.count 为 0