先说结果
iOS这边采用openssl+C语言方式实现了加密
即引入openssl库,用C语言header实现方法交换(rsa.h中RSA_public_encrypt方法)
这里是求证过程:
1.通过openssl库,iOS生成公钥,通过RSA_PKCS1_PADDING,是可以与java实现互相解密的。
这里java主要代码为:
Cipher ci = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding"); ci.init(Cipher.ENCRYPT_MODE, publicKey,new OAEPParameterSpec("SHA-256", "MGF1", new MGF1ParameterSpec("SHA-256"), PSource.PSpecified.DEFAULT));
2.找到java RSA中OAEPWithSHA-256AndMGF1Padding 和iOS RSA_PKCS1_OAEP_PADDING 区别
首先iOS 找不到mgf1 和 sha-256 关键字。我下载openssl最新的源码(https://www.openssl.org/),在crypto/rsa/路径下,找到了rsa_oaep.c
rsa.oaep.c可见所有方法都是走到ossl_rsa_padding_padding_add_PKCS1_OAEP_mgf1_ex 方法中,在此方法中在md==NULL是采用的EVP_sha1()
这是否说明,openssl默认都是sha1() , 如果我把这里方法换成sha_256() ,那么就满足java的padding方式了。
3.怎么试:
下方链接2 ,是c语言中如何适配此种加密,并且说明了编译过程。
当我们调用openssl中RSA_public_encrypt方法时传参,调用RSA_eay_public_encrypt,根据padding的int,选择到RSA_padding_add_PKCS1_OAEP_mgf1。链接中说道替换方法,用SHA-256替换SHA1.openssl中有sha256,直接交换方法。
在IOS中使用c源码,需要引用header,粘贴交换code
然后替换sha1
RSAFixed header最后放到工程中。
在加密时,由原来的RSA_public_encrypt 变成 RSA_public_encrypt_sha256
编译成功后联调,通过 ~
源码:有空再传git
2022.1.17 mark
RSADemo : https://gitee.com/zhangduck/RSADemo
参考链接:
OAEP 在openssl中的实现 链接1
https://blog.csdn.net/github_35454460/article/details/51862470
c语言中RSA/ECB/OAEPWithSHA-256AndMGF1Padding的实现 链接2
https://developer.aliyun.com/article/693527
写在最后:
1. 首先我们产品至涉及到公钥加密,后台(JAVA)下方公钥(PublicKey)的模(mod)和幂(Exp),移动端通过这两个参数生成公钥,对数据加密。
2.了解双端区别,哪天来个其他的padding方式都能通过这种方式解决。
mark:
网友评论