[英]Java and Openssl generates different length of public keys for same private key
[英]public key cryptograpy with Java and OpenSSL
在一个应用程序中,我想存储敏感数据(可以任意大),以便以后可以用于研究。 关键是我不希望数据处于未受保护的状态,因此我想在保存之前对其进行加密。
在另一台计算机上(在更可信赖的环境中),我想稍后再解密该数据。 应该可以使用容易获得的工具(例如OpenSSL)进行解密。 现在我的问题是:我该怎么做?
我已经知道抽象步骤:
byte[]
进行加密,并将其存储在某个位置。 我现在所缺少的是细节:
[2011-02-13更新]
经过一番研究后,我发现了一个页面,该页面准确地描述了我想做什么: http : //blog.altudov.com/2010/09/27/using-openssl-for-asymmetric-encryption-of-backups/ 。 基本上,我的步骤4的答案是以下命令行:
openssl smime -decrypt \
-in data.smime -binary -inform DER \
-inkey key.pem \
-out data
现在我的问题是:如何从Java生成格式与OpenSSL兼容的文件,以便可以使用此命令行将其解压缩? 我想每秒处理数百次,因此调用外部进程似乎太慢了。 这就是为什么我想直接用Java做到这一点。
我终于找到了我想要的东西。 我只是被诸如S/MIME
, ASN.1
, DER
等的所有术语弄糊涂了。 但是最后,似乎也是巧合的是,我从bouncycastle到达了CMS
(无论是什么意思)软件包,该软件包可以完成我想要的一切。 所以这是我的代码:
package de.roland_illig.crypto;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.GeneralSecurityException;
import java.security.Security;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import org.apache.commons.io.IOUtils;
import org.bouncycastle.cms.CMSEnvelopedDataStreamGenerator;
import org.bouncycastle.cms.CMSEnvelopedGenerator;
import org.bouncycastle.cms.CMSException;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
public class CryptDemo {
private static final File DIR = new File("c:/program files/cygwin/home/roland/crypto/");
private static X509Certificate certificate() throws IOException, GeneralSecurityException {
InputStream is = new FileInputStream(new File(DIR, "key.pub.der"));
CertificateFactory cf = CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate) cf.generateCertificate(is);
is.close();
return cert;
}
private static void encrypt() throws IOException, GeneralSecurityException, CMSException {
CMSEnvelopedDataStreamGenerator gen = new CMSEnvelopedDataStreamGenerator();
gen.addKeyTransRecipient(certificate());
InputStream is = new FileInputStream(new File(DIR, "secret"));
OutputStream out = new FileOutputStream(new File(DIR, "secret.encrypted"));
OutputStream encryptingOut = gen.open(out, CMSEnvelopedGenerator.AES128_CBC, "BC");
IOUtils.copy(is, encryptingOut);
is.close();
encryptingOut.close();
out.close();
}
public static void main(String[] args) throws Exception {
Security.addProvider(new BouncyCastleProvider());
encrypt();
}
}
您应该了解SSL是关于加密网络流量的。 带有证书等的公钥系统非常适合验证双方之间的信任。 如果您需要保护以后将要使用的东西,则可能不应该将先前的概念混入解决方案中。 它使您的生活更轻松。
以这个问题及其接受的答案为指针。 您可能应该做的是使用哈希函数从密码生成密钥。 然后,您将使用AES加密数据。 之后,在安全的位置,您将使用相同的密码来生成实际密钥并解密数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.