【问题标题】:iOS: RSA Encrypt using public key (with modulus and exponent)iOS:使用公钥进行 RSA 加密(带模数和指数)
【发布时间】:2013-10-27 20:52:19
【问题描述】:

我正在尝试使用公钥对 NSData 进行 RSA 加密。公钥格式如下:

<RSAKeyValue>
  <Modulus>yOTe0L1/NcbXdZYwliS82MiTE8VD5WD23S4RDsdbJOFzCLbsyb4d+K1M5fC+xDfCkji1zQjPiiiToZ7JSj/2ww==</Modulus>
  <Exponent>AWAB</Exponent>
</RSAKeyValue>

在从 XML 字符串中提取模数和指数后,如何在下面的方法中得到一个 SecKeyRef 用作publicKey

+ (NSString *)encryptRSA:(NSString *)plainTextString key:(SecKeyRef)publicKey
{
    size_t cipherBufferSize = SecKeyGetBlockSize(publicKey); 
    uint8_t *cipherBuffer = malloc(cipherBufferSize); 
    uint8_t *nonce = (uint8_t *)[plainTextString UTF8String]; 
    SecKeyEncrypt(publicKey,
        kSecPaddingOAEP, 
        nonce, 
        strlen( (char*)nonce ), 
        &cipherBuffer[0], 
        &cipherBufferSize);
    NSData *encryptedData = [NSData dataWithBytes:cipherBuffer length:cipherBufferSize]; 
    return [encryptedData base64EncodedString];
}

我似乎无法在任何地方找到明确的答案。

【问题讨论】:

    标签: iphone ios xml encryption rsa


    【解决方案1】:

    哇,难怪很难找到答案。我在加密兔子洞里呆了 2 天,结果并不漂亮。

    简单的方法

    使用Chilkat iOS RSA Library。一个主要缺点:售价 189 美元! :O

    艰难的道路

    解析 XML,使用SCZ-BasicEncodingRules-iOS 从模数和指数中生成公钥数据。如果可行,请使用该公钥创建一个虚拟钥匙串(按照sample code here),现在以SecKeyRef 格式提取公钥并将其传递给问题中的encryptRSA 方法。最后,清理,删除虚拟钥匙串。理论上听起来不错,但我从来没有彻底测试过,如果你这样做了,请告诉我!

    【讨论】:

    • 如何将 xml 解析为 NSData 对象?
    • 答案建议付费服务,并否认在开源/免费软件中没有其他替代品。
    【解决方案2】:

    我已经使用以下方法使用公钥进行加密,而没有使用任何第三方库,猜想它可能会帮助谁在像我一样实现它之后寻找相同的方法:D

    +(NSString *)encryptRSA:(NSString *)plainTextString key:(SecKeyRef)publicKey
    {
        size_t cipherBufferSize = SecKeyGetBlockSize(publicKey);
        uint8_t *cipherBuffer = malloc(cipherBufferSize);
        uint8_t *nonce = (uint8_t *)[plainTextString UTF8String];
        SecKeyEncrypt(publicKey,
                      kSecPaddingPKCS1,
                      nonce,
                      strlen( (char*)nonce ),
                      &cipherBuffer[0],
                      &cipherBufferSize);
        NSData *encryptedData = [NSData dataWithBytes:cipherBuffer length:cipherBufferSize];
        return [encryptedData base64EncodedStringWithOptions:0];
    }
    

    【讨论】:

      【解决方案3】:

      我想这会对你有所帮助! 您可以创建一个 java 文件,如同胞: 这个java函数将生成一个base64String的公钥

      public static RSAPublicKey getPublicKey(String modulus, String exponent) {
          try {
              BigInteger b1 = new BigInteger(modulus,16);
              BigInteger b2 = new BigInteger(exponent,16);
              KeyFactory keyFactory = KeyFactory.getInstance("RSA");
              RSAPublicKeySpec keySpec = new RSAPublicKeySpec(b1, b2);
              return (RSAPublicKey) keyFactory.generatePublic(keySpec);
          } catch (Exception e) {
              e.printStackTrace();
              return null;
          }
      }
      
      public static  String  encodePublicKey(byte[] encoded) throws Exception{
          BASE64Encoder base64Encoder= new BASE64Encoder();
          String s=base64Encoder.encode(encoded);
          return s;
      

      你应该像这样使用:encodePublicKey(publicKey.getEncoded());

      知道了!

      【讨论】:

      • 你建议如何在 iOS 上运行它?
      • OP 正在 iOS 中寻找答案,请重新访问您的答案并尝试提供一些相关代码。否则这个答案是没有用的......
      猜你喜欢
      • 2015-10-13
      • 2011-08-16
      • 2019-08-06
      • 1970-01-01
      • 1970-01-01
      • 2014-04-16
      • 2013-04-04
      • 2010-10-31
      • 2015-04-02
      相关资源
      最近更新 更多