先說結(jié)果
iOS這邊采用openssl+C語言方式實現(xiàn)了加密
即引入openssl庫,用C語言header實現(xiàn)方法交換(rsa.h中RSA_public_encrypt方法)
這里是求證過程:
1.通過openssl庫,iOS生成公鑰,通過RSA_PKCS1_PADDING,是可以與java實現(xiàn)互相解密的。
這里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.找到j(luò)ava RSA中OAEPWithSHA-256AndMGF1Padding 和iOS RSA_PKCS1_OAEP_PADDING 區(qū)別
首先iOS 找不到mgf1 和 sha-256 關(guān)鍵字。我下載openssl最新的源碼(https://www.openssl.org/),在crypto/rsa/路徑下,找到了rsa_oaep.c

可見所有方法都是走到ossl_rsa_padding_padding_add_PKCS1_OAEP_mgf1_ex 方法中,在此方法中在md==NULL是采用的EVP_sha1()
這是否說明,openssl默認(rèn)都是sha1() , 如果我把這里方法換成sha_256() ,那么就滿足java的padding方式了。
3.怎么試:
下方鏈接2 ,是c語言中如何適配此種加密,并且說明了編譯過程。
當(dāng)我們調(diào)用openssl中RSA_public_encrypt方法時傳參,調(diào)用RSA_eay_public_encrypt,根據(jù)padding的int,選擇到RSA_padding_add_PKCS1_OAEP_mgf1。鏈接中說道替換方法,用SHA-256替換SHA1.openssl中有sha256,直接交換方法。
在IOS中使用c源碼,需要引用header,粘貼交換code

然后替換sha1

最后放到工程中。
在加密時,由原來的RSA_public_encrypt 變成? RSA_public_encrypt_sha256
編譯成功后聯(lián)調(diào),通過 ~
源碼:有空再傳git
2022.1.17? mark?
RSADemo : https://gitee.com/zhangduck/RSADemo
參考鏈接:
OAEP 在openssl中的實現(xiàn)? 鏈接1
https://blog.csdn.net/github_35454460/article/details/51862470
c語言中RSA/ECB/OAEPWithSHA-256AndMGF1Padding的實現(xiàn) 鏈接2
https://developer.aliyun.com/article/693527
寫在最后:
1.? 首先我們產(chǎn)品至涉及到公鑰加密,后臺(JAVA)下方公鑰(PublicKey)的模(mod)和冪(Exp),移動端通過這兩個參數(shù)生成公鑰,對數(shù)據(jù)加密。
2.了解雙端區(qū)別,哪天來個其他的padding方式都能通過這種方式解決。
mark:
