RSAEncrypt 1.1.0

RSAEncrypt 1.1.0

测试已测试
语言语言 Obj-CObjective C
许可 MIT
发布最新版本2017年1月

Rigel维护。



  • Rigel

       

RSAEncrypt是一个简单的RSA加密库。使用字符串进行加密,包含使用openssl生成密钥对的步骤。RSAEncrypt使用公钥文件base64字符串进行加密,避免了使用Security Framework API添加伪造证书字符串加密方式,可能会导致的加密永久失败的问题(此问题重装应用才可解决)。

功能

  • 非伪造证书方式
  • 对明文进行RSA加密
  • 支持指定Padding
  • 从指定公钥der文件导出公钥字符串
  • openssl密钥对生成方法。

用法

手动

直接将RSAEncrypt添加到项目中。

关于Padding

不使用Padding,同一明文每次加密后的密文是一样的,使用不同的Padding,密文长度会有变化。具体使用哪种Padding需要与服务端保持一致。

openssl生成密钥对步骤

输入以下命令,根据提示输入信息:

openssl req -x509 -out public_key.der -outform der -new -newkey rsa:1024 -keyout private_key.pem -days 3650

得到密钥对:public_key.der private_key.pem

对私钥进行PKCS#8编码

openssl pkcs8 -topk8 -in private_key.pem -out pkcs8_rsa_private_key_zn.pem -nocrypt

从编码后的私密文件中拷贝出中间部分,供后台使用:

MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAMAT1XwWvkqTg+tD XmArwsG33GsUGizSzP0QzCzr7YKCJFKz2W/Jkv+sLT0JuWD/zWi5WhVYJPY6hEi2 jLfTVBz3vOtqimiwY036Akhh57gSpQ7CAm+2KFwy/7kSUDBfs19TanlF+NaRX6by JIuTipGYnFM4zbH+OI7WYhBPM6L1AgMBAAGjgekwgeYwHQYDVR0OBBYEFM3kGeWGdcU QtjpVSBeTgURozmPDMIG2BgNVHSMEga4wgauAFM3kGeWGdcUQtjpVSBeTgURozmPD oYGHpIGEMIGBMQswCQYDVQQGEwJyaTEOMAwGA1UECBMFcmlnZWwxDjAMBgNVBAcT BXJpZ2VsMQ4wDAYDVQQKEwVyaWdlbDEOMAwGA1UECxMFcmlnZWwxDjAMBgNVBAMT BXJpZ2VsMSIwIAYJKoZIhvcNAQkBFhNyaWdlbHh1QGZveG1haWwuY29tggkAxq gOUzItsiYwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQAOXqnuJ1 XYjs3MXcTVPxPmVYuAEHNLwebb84TV7RH0m2JWocowznyGu0UzWuFeELMfztoas YLoFrY6+b2mC0VtUm+KQyo1Ti7NMxuOOGsZOgF0KyEc6psz36yqv0mDL4N0fj x7t0+a27VlSrUbCipeMZXwFmv+s7ykHFkO6Jq0Cg==

未进行PKCS#8编码的私钥也可以使用,服务端解密时需要做如下处理:

RSAPrivateKeyStructure asn1PrivKey = new RSAPrivateKeyStructure((ASN1Sequence) ASN1Sequence.fromByteArray(priKeyData));

RSAPrivateKeySpec rsaPrivKeySpec = new RSAPrivateKeySpec(asn1PrivKey.getModulus(), asn1PrivKey.getPrivateExponent());

KeyFactory keyFactory= KeyFactory.getInstance("RSA");

PrivateKey priKey= keyFactory.generatePrivate(rsaPrivKeySpec);

生成公钥字符串

对公钥文件进行base64 encode,需要将公钥文件导入iOS工程,调用PublicKeyStringFromFile方法导出。得到iOS端加密方式使用的公钥字符串

MIIDbDCCAtWgAwIBAgIJAMaoDlMyLbImMA0GCSqGSIb3DQEBBQUAMIGBMQswCQ YDVQQGEwJyaTEOMAwGA1UECBMFcmlnZWwxDjAMBgNVBAcTBXJpZ2VsMQ4wDAYD VQQKEwVyaWdlbDEOMAwGA1UECxMFcmlnZWwxDjAMBgNVBAMTBXJpZ2VsMSIwI AYJKoZIhvcNAQkBFhNyaWdlbHh1QGZveG1haWwuY29tMB4XDTE2MDExOTAzMj M1NFoXDTI2MDExNjAzMjM1NFowgYExCzAJBgNVBAYTAnJpMQ4wDAYDVQQIEwVya WdlbDEOMAwGA1UEBxMFcmlnZWwxDjAMBgNVBAoTBXJpZ2VsMQ4wDAYDVQQLEwVya WdlbDEOMAwGA1UEAxMFcmlnZWwxIjAgBgkqhkiG9w0BCQEWE3JpZ2VseHVAZm94 bWFpbC5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMAT1XwWvkqTg+tD XmArwsG33GsUGizSzP0QzCzr7YKCJFKz2W/Jkv+sLT0JuWD/zWi5WhVYJPY6hEi2 jLfTVBz3vOtqimiwY036Akhh57gSpQ7CAm+2KFwy/7kSUDBfs19TanlF+NaRX6by JIuTipGYnFM4zbH+OI7WYhBPM6L1AgMBAAGjgekwgeYwHQYDVR0OBBYEFM3kGe WGdcUQtjpVSBeTgURozmPDMIG2BgNVHSMEga4wgauAFM3kGeWGdcUQtjpVSBe TgURozmPDoYGHpIGEMIGBMQswCQYDVQQGEwJyaTEOMAwGA1UECBMFcmlnZWwxDjA MBgNVBAcTBXJpZ2VsMQ4wDAYDVQQKEwVyaWdlbDEOMAwGA1UECxMFcmlnZWwxDjA MBgNVBAMTBXJpZ2VsMSIwIAYJKoZIhvcNAQkBFhNyaWdlbHh1QGZveG1haWwuY29 tggkAxqgOUzItsiYwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQAOXq nuJ1XYjs3MXcTVPxPmVYuAEHNLwebb84TV7RH0m2JWocowznyGu0UzWuFeELMf ztoasYLoFrY6+b2mC0VtUm+KQyo1Ti7NMxuOOGsZOgF0KyEc6psz36yqv0mDL4N 0fjx7t0+a27VlSrUbCipeMZXwFmv+s7ykHFkO6Jq0Cg==

使用私钥导出公钥,生成Android端使用的公钥

openssl rsa -in private_key.pem -out rsa_public_key_android.pem -pubout

得到的公钥是

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDAE9V8Fr5Kk4PrQ15gK8LBt9xr FBos0sz9EMws6+2CgiRSs9lvyZL/rC09Cblg/81ouVoVWCT2OoRItoy301Qc97z raoposGNN+gJIYee4EqUOwgJvtihcMv+5ElAwX7NfU2p5RfjWkV+m8iSLk4qRmJx TOM2x/jiO1mIQTzOi9QIDAQAB

事实上,iOS可以与Android使用同一公钥串(使用私钥导出的),但这种公钥串在iOS端加密时需要操作kenchain。在一些极端情况下可能会出现加密失败的问题。而使用第一种方式生成的公钥,不需要操作keychain,可以避免加密失败的问题。

待办事项

  • 添加解密方法。
  • 添加对RSA 文件的支持。
  • 添加验签方法
  • 支持明文解密
  • 支持Carthage
  • 编写单元测试
  • Java加解密

许可证

RSAEncrypt根据MIT许可证发布。