java - 我的 CipherOutputStream 无声地失败

标签 java encryption

我正在尝试使用公钥加密 Java 中的一些二进制数据,如这个有用页面中所述: http://www.junkheap.net/content/public_key_encryption_java

按照页面的指示,我使用以下命令创建了公钥和私钥:

openssl genrsa -aes256 -out private.pem 2048
openssl rsa -in private.pem -pubout -outform DER -out public.der

现在我用一个小程序保存加密一些数据:

public class Rsa {

    public static void main(String[] args) throws Exception, IOException {
        File keyFile = new File("public.der");
        byte[] encodedKey = new byte[(int) keyFile.length()];

        new FileInputStream(keyFile).read(encodedKey);

        X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(encodedKey);

        KeyFactory kf = KeyFactory.getInstance("RSA");
        PublicKey pk = kf.generatePublic(publicKeySpec);

        Cipher rsa = Cipher.getInstance("RSA");

        rsa.init(Cipher.ENCRYPT_MODE, pk);

        FileOutputStream fileOutputStream = new FileOutputStream(
                "encrypted.rsa");
        OutputStream os = new CipherOutputStream(fileOutputStream, rsa);

        byte[] raw = new byte[245];
        raw[0] = 4;

        os.write(raw);
        os.flush();
        os.close();


    }
}

上面的代码有效,但是当我将字节数组的大小更改为 246 时,它会生成一个零长度文件!

我做错了什么?

最佳答案

CipherOutputStream 倾向于吞并由它包装的 Cipher 和 OutputStream 对象生成的异常。 Sun RSA 实现不会加密超过 M-11 个字节,其中 M 是模数的字节长度。默认的 PKCS1Padding 是这样,除非您真的知道自己在做什么,否则您应该始终使用它。您可以指定 NoPadding 从而获得完整的 M 字节。

RSA 不是加密大量数据的正确选择。普遍接受的使用 RSA 加密数据的方法是生成随机对称 session key K。例如一个 AES key ,用 K 的对称算法加密数据,然后使用所有接收者的 RSA key 加密 K。

关于java - 我的 CipherOutputStream 无声地失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2221730/

相关文章:

c++ - 带有加密 std::string 的 sqlite 查询(无法识别的 token )

java - Tomcat 文件夹作为类路径?

java - Guava 供应商 : transforming a collection with each element's own function

c# - 使用 AES/Rijndael 在 PHP 中加密,在 C# (WP7/Silverlight) 中解密

passwords - 基于密码的加密在技术上是如何工作的?

C# 解密值和公共(public)类属性...有什么风险?

php - openssl_decrypt 标签值

java - 从子类更改父类(super class)实例变量的值

java - 使用 JUNG 在 java 中需要相同的对象

Java InterruptedException - 我对线程被中断意味着什么或为什么会被中断感到困惑