You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java应用基于BouncyCastle实现NTRU加密的技术求助

Java中使用BouncyCastle实现NTRU文本加密

前置准备

确保项目引入支持后量子算法的BouncyCastle依赖,以Maven为例:

<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.77</version>
</dependency>
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcutil-jdk15on</artifactId>
    <version>1.77</version>
</dependency>

完整实现代码

以下基于JCA接口实现,避开轻量级API的兼容性问题:

import org.bouncycastle.jce.provider.BouncyCastleProvider;
import javax.crypto.Cipher;
import java.security.*;
import java.util.Base64;

public class NtruEncryptionDemo {
    // 注册BouncyCastle安全提供者
    static {
        if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null) {
            Security.addProvider(new BouncyCastleProvider());
        }
    }

    // 生成NTRU密钥对(对应NTRU_HPS_2048_509参数集)
    public static KeyPair generateNtruKeyPair() throws NoSuchAlgorithmException, NoSuchProviderException {
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("NTRU", BouncyCastleProvider.PROVIDER_NAME);
        keyGen.initialize(2048);
        return keyGen.generateKeyPair();
    }

    // 加密文本
    public static String encrypt(String plainText, PublicKey publicKey) throws Exception {
        Cipher cipher = Cipher.getInstance("NTRU", BouncyCastleProvider.PROVIDER_NAME);
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] encryptedBytes = cipher.doFinal(plainText.getBytes("UTF-8"));
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }

    // 解密文本
    public static String decrypt(String encryptedText, PrivateKey privateKey) throws Exception {
        Cipher cipher = Cipher.getInstance("NTRU", BouncyCastleProvider.PROVIDER_NAME);
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] encryptedBytes = Base64.getDecoder().decode(encryptedText);
        byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
        return new String(decryptedBytes, "UTF-8");
    }

    public static void main(String[] args) {
        try {
            KeyPair keyPair = generateNtruKeyPair();
            String original = "需要加密的测试内容";
            
            String encrypted = encrypt(original, keyPair.getPublic());
            System.out.println("加密结果: " + encrypted);
            
            String decrypted = decrypt(encrypted, keyPair.getPrivate());
            System.out.println("解密结果: " + decrypted);
            
            System.out.println(original.equals(decrypted) ? "验证通过" : "验证失败");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

关键注意事项

  • 提供者注册:必须提前注册BouncyCastle,否则JCA无法识别NTRU算法。
  • 参数集选择:示例用2048位密钥对应NTRU_HPS_2048_509,也可根据需求选4096位(对应NTRU_HPS_4096_821)。
  • 编码规范:统一用UTF-8处理文本与字节的转换,加密后用Base64编码便于传输存储。
  • 异常处理:实际项目建议细化异常捕获,避免直接捕获通用Exception。

内容的提问来源于stack exchange,提问作者XIO_ennu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 11:15:29