Objective-c / 是否可以在没有外部库的情况下使用模数和指数加密 rsa?

问题描述

今天,我使用openssl实现了rsa加密逻辑。没有像openssl这样的外部库有可能吗?使用由模数和指数组成的公钥。

我的消息来源大致是这样的。

-(Nsstring *)hexWithData:(unsigned char *)data ofLength:(NSUInteger)len
{
    NSMutableString *tmp = [NSMutableString string];
    for (NSUInteger i = 0; i < len; i++) {
        [tmp appendFormat:@"%02x",data[i]];
    }
    
    return tmp;
}

-(void)EncryptionWithRSA
{
    RSAGenWithSecurity *akClass = [[RSAGenWithSecurity alloc] init];
    Nsstring *plainText = [akClass ParseJWT];
    const char *plain = [plainText UTF8String];
    
    RSA *publickey = [self GenKeyWithRSA];
    
    int rsa_length = RSA_size(publickey);
    unsigned char *crip[rsa_length];
    
    Nsstring *result = [[Nsstring alloc] init];
    
    int irsaRet = RSA_public_encrypt(strlen(plain),(const unsigned char *)plain,(unsigned char *)crip,publickey,RSA_PKCS1_PADDING);
    
    if(irsaRet <= 0) {
        NSLog(@"encrypt Failed");
        result = @"";
    } else {
        result = [self hexWithData:crip ofLength:rsa_length];
//        result = [Nsstring stringWithUTF8String:(char *)crip];
        
        NSLog(@"encrypt success: %@",result);
    }
}

很抱歉通过翻译问你一个不成熟的问题。

解决方法

是的,当然有可能。要实施,您需要具备以下条件。

  1. 需要加密的字节流。
  2. RSA 模数和指数。假设模数是 n 字节长。

现在要加密流,您可以按如下方式进行。

  1. 使用一个长度为 n 字节的字节块。如果没有,用零填充(后缀)。
  2. 将块提升到指数的幂(例如使用连续平方)并计算模数。
  3. 如果结果不是 n 字节长,则再次填充零(这次是前缀)。

就是这样,你有一个加密的流。