1
我有以下生成AES-128一次性密钥的代码。之后,我使用从证书读取的RSA公钥加密此一次性密钥。加密的字节总是0.为什么?这个加密代码有什么问题?
// Generate a one-time key
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128);
SecretKey oneTimeKey = keyGenerator.generateKey();
System.out.println("Encrypted bytes length: " + oneTimeKey.getEncoded().length); // prints "Plain bytes length: 16"
// Retrieve public key from certificate
FileInputStream fileInputStream = new FileInputStream("D:\\test.cer");
CertificateFactory factory = CertificateFactory.getInstance("X.509");
X509Certificate certificate = (X509Certificate) factory.generateCertificate(fileInputStream);
PublicKey publicKey = certificate.getPublicKey();
// Encrypt one-time key using the public key.
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
CipherOutputStream cipherOutputStream = new CipherOutputStream(byteArrayOutputStream, cipher);
cipherOutputStream.write(oneTimeKey.getEncoded(), 0, oneTimeKey.getEncoded().length);
// Retrieve the encrypted bytes.
System.out.println("Encrypted bytes length: " + byteArrayOutputStream.toByteArray().length); // prints "Encrypted bytes length: 0"
cipherOutputStream.close();
谢谢!在获取字节数组之前,我调用了cipherOutputStream.close(),并且它现在可以工作。奇怪的是,这段代码几周来一直工作正常,没有刷新卡珀斯输出流。 – user3573403 2015-02-11 09:54:42
然后你不应该接受我以前的回答:)这是错误的,因为我混淆了“密钥大小”和“块大小”两个术语。不过,似乎解决方案是调用flush方法:) – mkrakhin 2015-02-11 09:58:47