gpt4 book ai didi

java - 使用 Java 和 OpenSSL 的公钥加密

转载 作者:行者123 更新时间:2023-11-30 11:55:37 28 4
gpt4 key购买 nike

在一个应用程序中,我想存储敏感数据(可以是任意大的)以便以后可以用于研究。关键是我不希望数据不 protected 地到处乱放,所以我想在保存之前对其进行加密。

在另一台计算机上(在更可靠的环境中)我想稍后解密该数据。应该可以使用现成的工具(例如 OpenSSL)进行解密。现在我的问题是:我该怎么做?

我已经知道了抽象步骤:

  1. 一劳永逸地生成公钥/私钥对。
  2. 使用公钥在 Java 中加密 byte[],并将其存储在某个地方。
  3. 将加密数据复制到“更安全”的计算机。
  4. 使用简单的 OpenSSL 命令行解密保存的数据。

我现在缺少的是细节:

  • 我需要什么样的 key 对?
  • 我应该使用什么加密方案? (这可能类似于“rsa 加密对称 key ,然后使用该 key 加密数据”)
  • 简单的 OpenSSL 命令行是什么样子的?

[更新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 兼容的文件,以便我可以使用此命令行解压缩它?我想每秒执行此 hundrets 次,因此调用外部进程似乎太慢了。这就是为什么我想直接用 Java 来做。

最佳答案

我终于找到了我要找的东西。我刚刚被 S/MIMEASN.1DER 等所有术语弄糊涂了。但最后,似乎是巧合,我从 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();
}
}

关于java - 使用 Java 和 OpenSSL 的公钥加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4914196/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com