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

J2ME 安全開發實戰:Bouncy Castle Crypto API 完整應用指南

     編輯:J2ME

前言:為何行動裝置需要密碼學?

無線通訊易遭竊聽,且裝置算力有限,傳統 TLS/SSL 完整實作過於沉重。Bouncy Castle 提供輕量級、開源、支援 MIDP 的完整密碼學套件,涵蓋對稱加密、非對稱加密、雜湊、數位簽章、憑證解析等,是 J2ME 安全開發的首選。

J2ME 安全架構簡述

  • CLDC/MIDP 沙箱:位元組碼預驗證、受信任/非受信任保護域、敏感 API 權限機制。
  • 應用層加密:保護資料本身而非傳輸管道,符合端到端安全原則。

Bouncy Castle 特性與整合要點

  • 支援 JCE 1.2.1 介面,從 J2SE 1.4 到 MIDP 皆可執行。
  • 文件缺乏:需閱讀原始碼與測試案例理解類別關係。
  • 必須混淆:未混淆會在實機拋 NoClassDefFoundError: java.math.BigInteger。推薦 ProGuard、RetroGuard(開源)或 DashO(商業)。
  • 只引入用到的原始碼模組,配合混淆將 JAR 壓至最小。

核心功能程式碼範例

1. RSA 1024-bit 金鑰對產生(WTK 2.5 約 2 分鐘)

public void generateRSAKeyPair() throws Exception {
    SecureRandom sr = new SecureRandom();
    BigInteger pubExp = new BigInteger("10001", 16); // 65537
    RSAKeyGenerationParameters param = new RSAKeyGenerationParameters(pubExp, sr, 1024, 80);
    RSAKeyPairGenerator gen = new RSAKeyPairGenerator();
    gen.init(param);
    AsymmetricCipherKeyPair pair = gen.generateKeyPair();
    RSAPrivateCrtKeyParameters priv = (RSAPrivateCrtKeyParameters) pair.getPrivate();
    RSAKeyParameters pub = (RSAKeyParameters) pair.getPublic();
    // 儲存 priv/pub 供後續使用
}

2. 數位簽章(RSA + SHA1 + PSS)

public byte[] sign(byte[] data, RSAPrivateCrtKeyParameters priv) throws Exception {
    SHA1Digest digest = new SHA1Digest();
    RSAEngine engine = new RSAEngine();
    PSSSigner signer = new PSSSigner(engine, digest, 64); // salt=64 bytes
    signer.init(true, priv);
    signer.update(data, 0, data.length);
    return signer.generateSignature();
}

public boolean verify(byte[] data, byte[] sig, RSAKeyParameters pub) throws Exception {
    SHA1Digest digest = new SHA1Digest();
    RSAEngine engine = new RSAEngine();
    PSSSigner signer = new PSSSigner(engine, digest, 64);
    signer.init(false, pub);
    signer.update(data, 0, data.length);
    return signer.verifySignature(sig);
}

3. 加密/解密(RSA ECB/PKCS1)

public byte[] encrypt(String plain, RSAKeyParameters pub) throws Exception {
    AsymmetricBlockCipher cipher = new RSAEngine();
    cipher.init(true, pub);
    return cipher.processBlock(plain.getBytes(), 0, plain.getBytes().length);
}

public String decrypt(byte[] cipherText, RSAPrivateCrtKeyParameters priv) throws Exception {
    AsymmetricBlockCipher cipher = new RSAEngine();
    cipher.init(false, priv);
    byte[] plain = cipher.processBlock(cipherText, 0, cipherText.length);
    return new String(plain).trim();
}

4. X.509 憑證解析(DER 格式)

public void parseCert(byte[] der) throws Exception {
    ASN1InputStream in = new ASN1InputStream(new ByteArrayInputStream(der));
    ASN1Sequence seq = (ASN1Sequence) in.readObject();
    X509CertificateStructure cert = new X509CertificateStructure(seq);
    TBSCertificateStructure tbs = cert.getTBSCertificate();
    System.out.println("Subject: " + tbs.getSubject());
    System.out.println("Issuer:  " + tbs.getIssuer());
    System.out.println("Serial:  " + tbs.getSerialNumber().getValue());
    // Extensions 遍歷...
}

效能與部署建議

  • 非對稱運算極慢:1024-bit RSA 金鑰產生 ~2 分鐘(WTK),實機更久。建議:金鑰在伺服器端產生,裝置僅負責簽章/驗證/解密。
  • 對稱加密(AES、DES)速度可接受,適合大量資料加密。
  • 混淆器務必開啟「縮短類別/方法名稱」、「移除未用代碼」、「重新封裝套件」。
  • 測試真機時開啟除錯模式捕獲 NoClassDefFoundError,確認所有相依類別皆已打包。

結語

Bouncy Castle 讓 J2ME 擁有桌面級密碼學能力,配合妥善的金鑰管理與混淆部署,能構建符合商業安全需求的行動應用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved