首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 後端與 iOS 客戶端 RSA 加密對接指南:密鑰格式轉換與填充模式統一

     編輯:程式設計疑難解答

核心衝突點

環節Java 默認iOS (Security.framework) 默認解決方案
密鑰編碼PKCS#8 (私鑰), X.509 (公鑰)PKCS#1 (傳統)Java 生成 PKCS#1,或 iOS 轉換 PKCS#8→PKCS#1
Base64標準 Base64標準 Base64雙方統一無換行、無空格
填充模式RSA/ECB/PKCS1PaddingSecPadding.PKCS1 (默認)雙方顯式指定 PKCS1Padding
加密數據長度KeySize/8 - 11 bytes同分段加密(長數據用 AES+RSA 混合)

Java 端生成 PKCS#1 密鑰對

KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(2048);
KeyPair kp = kpg.generateKeyPair();

// 私鑰轉 PKCS#1 (需 BouncyCastle)
PKCS8EncodedKeySpec pkcs8 = new PKCS8EncodedKeySpec(kp.getPrivate().getEncoded());
PrivateKeyInfo pki = PrivateKeyInfo.getInstance(pkcs8.getEncoded());
RSAPrivateKey rsaPriv = RSAPrivateKey.getInstance(pki.parsePrivateKey());
byte[] pkcs1Priv = rsaPriv.getEncoded(); // PKCS#1 DER
String base64Priv = Base64.getEncoder().encodeToString(pkcs1Priv);

// 公鑰 X.509 → PKCS#1
SubjectPublicKeyInfo spki = SubjectPublicKeyInfo.getInstance(kp.getPublic().getEncoded());
RSAPublicKey rsaPub = RSAPublicKey.getInstance(spki.parsePublicKey());
byte[] pkcs1Pub = rsaPub.getEncoded();
String base64Pub = Base64.getEncoder().encodeToString(pkcs1Pub);

iOS 端使用


// 加載公鑰加密
SecKeyRef publicKey = [self addPublicKey:base64Pub];
NSData *encrypted = [self rsaEncrypt:plainData key:publicKey padding:SecPadding.PKCS1];

// 加載私鑰解密
SecKeyRef privateKey = [self addPrivateKey:base64Priv];
NSData *decrypted = [self rsaDecrypt:encryptedData key:privateKey padding:SecPadding.PKCS1];

最佳實踐

  • **長數據採用混合加密**:隨機生成 AES Key 加密數據,RSA 加密 AES Key 傳輸。
  • 雙方約定密鑰格式文檔,包含 Base64 字符串示例。
  • 集成測試階段互相提供測試向量(明文/密文/密鑰)驗證互通性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved