7

有没有办法使用 Sun 的 keytool 程序生成适合加密的 128 位密钥对?似乎http://java.sun.com/javase/6/docs/technotes/guides/security/StandardNames.html#KeyPairGenerator中提供的算法要么不受支持,要么不允许短于 512 位的密钥。

密钥对将与 ff 一起使用。代码片段:

Security.addProvider(new BouncyCastleProvider());

KeyStore keyStore = KeyStore.getInstance("PKCS12");

FileInputStream keyStoreSource = new FileInputStream("keystore");

try {
    keyStore.load(keyStoreSource, "password".toCharArray());
} finally {
    keyStoreSource.close();
}

String alias = (String) keyStore.aliases().nextElement();
PrivateKey privateKey = (PrivateKey) keyStore.getKey(alias, "password".toCharArray());
X509Certificate certificate = (X509Certificate) keyStore.getCertificate(alias);

CMSEnvelopedDataStreamGenerator generator = new CMSEnvelopedDataStreamGenerator();

generator.addKeyTransRecipient(certificate);

OutputStream output2 = generator.open(output, CMSEnvelopedDataGenerator.AES128_CBC, BouncyCastleProvider.PROVIDER_NAME);

try {
    IOUtils.copy(input, output2);
} finally {
    output2.close();
    output.close();
}

其中输出是一些将保存加密数据的 OutputStream,输入是一些将读取明文数据的 InputStream。

4

3 回答 3

5

您只需要指定不同的 storetype

keytool -genseckey -alias check2 -keyalg AES -keysize 128 -storepass changeit -storetype JCEKS -keystore ks.jck

于 2012-04-20T15:29:34.397 回答
2

证书用于公钥加密,不包含对称分组密码 AES-128 的加密密钥。相反,公钥加密仅用于加密或协商 128 位 AES 密钥,其余对话使用 AES。

128 位 AES 密钥不是证书,它只是来自加密强随机数生成器的 128 位,或者使用散列算法(如PBKDF2 )从密码短语派生而来。如何获得这些位将取决于您的应用程序。SSL/TLS 必须协商一个随机密钥,但硬盘加密程序会从密码中派生密钥。

于 2009-05-19T18:17:45.880 回答
0

不能生成短于 512 位的密钥对是有道理的。公钥加密需要比对称密钥加密更长的密钥来维持相同级别的安全性。不建议将 128 位密钥对用于公钥加密。

于 2009-05-19T09:17:24.693 回答