java - 使用 BouncyCaSTLe API 进行 RSA 加密

标签 java encryption rsa bouncycastle public-key-encryption

当我想在 Java 中使用 RSA 和 BouncyCaSTLe API 加密文件时遇到问题。问题如下:在下面的代码中,我创建 RSAKeyParameters 对象的行,其构造函数询问我三个参数:
1.如果我们想用公钥或私钥加密。
2. 具有 key 模数的 BigInteger。
3. 带有键指数的 BigInteger。

我的方法接收的第一个参数是包含 key 的文件。那么在RSAKeyParameter的构造函数中,如何向其传递一个作为模数和指数的BigInteger?如何从文件中获取模数和指数?

PD:包含 key 的文件有 CR 和 LF,这就是为什么有两个 readLine()。

void cifrar_asimetrica(String fichClave, String archivoClaro, String result, boolean conPrivada){

    byte[] modulo;
    byte[] exponente;

    try(
        BufferedReader lectorClave = new BufferedReader (new FileReader(fichClave));
        BufferedInputStream lectorFichero = new BufferedInputStream(new FileInputStream(archivoClaro));
        BufferedOutputStream fsalida = new BufferedOutputStream(new FileOutputStream(result))){

        modulo = Hex.decode(lectorClave.readLine()); 
        exponente = Hex.decode(lectorClave.readLine());


        RSAEngine cifrador = new RSAEngine();
        CipherParameters parametro = new RSAKeyParameters(conPrivada, new BigInteger(modulo.toString()), new BigInteger(exponente.toString()));

        cifrador.init(true,parametro); // vamos a cifrar

        byte[] datosLeidos = new byte[cifrador.getOutputBlockSize()];
        byte[] datosCifrados = new byte[cifrador.getOutputBlockSize()];
        int leidos = 0;
        //NO SE SI ES GETINPUTBLOCKSIZE O OUTPUT
        leidos = lectorFichero.read(datosLeidos, 0, cifrador.getOutputBlockSize());

        while(leidos > 0){
            datosCifrados = cifrador.processBlock(datosLeidos, 0, cifrador.getOutputBlockSize());
            fsalida.write(datosCifrados, 0, datosCifrados.length);
            leidos = lectorFichero.read(datosLeidos, 0, cifrador.getOutputBlockSize());
        }

    }catch(Exception e){
        e.printStackTrace();
    }
}

最佳答案

如果从文件中的十六进制转换而来的字节数组按照惯例是大端字节序,则要将正大端字节数组转换为 BigInteger,请查看 the javadoc for BigInteger对于构造函数,它采用 int 符号表示正数,采用大端字节数组表示大小。

“教科书”(未填充)RSA 不安全;请参阅 crypto.SX security.SX 和维基百科。对大于一个区 block 的数据使用 RSA,按照您的编码方式将会半随机失败,如果您纠正这一点,那么相当于 ECB 模式的效率低下且不安全;请参阅 crypto.SX security.SX 和维基百科。使用未经身份验证的公钥通常是不安全的。

如果您这样做是为了好玩,因为它让您感觉自己像“l33t hack5r”或邦德 super 恶棍,并且不关心实际的安全性,那么这很好。如果您需要或想要真正的安全性,请放弃这个并使用由知道自己在做什么的人编写的程序,和/或搜索“不要使用自己的加密货币”。

关于java - 使用 BouncyCaSTLe API 进行 RSA 加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48993560/

相关文章:

ssl - 我应该在 SSL 加密之前或之后压缩我的数据流吗?

encryption - 如何将 .net core RSA pem 转换为 xml?

javascript - 使用 WebCrypto API 从私钥生成公钥

Selenium Webdriver Java 中的 JavascriptExecutor

.net - .NET框架中最安全的哈希算法是什么?

java - 动画静态属性?

encryption - 为什么在加密的 AES key 的 Python 密码 RSA 解密中抛出错误?

c# - 如何在 C# 中填写 RSAParameters 值

带有/*package*/后缀的Java package-private可见性成员

java - 如何作为方法的结果返回 DataSnapshot 值?