在FIPS模式下,PKCS#12格式在加密文件时必须使用兼容的加密和哈希算法。
当我阅读BC-FIPS文档时,它说在批准模式下,它们不支持PKCS#12,因此这意味着我们无法在BC-FIPS批准模式下读取PKCS12密钥库;我们使用BC-FIPS作为加密提供者,还使用PKCS12和JKS格式存储密钥和证书。
BC-FIPS声称-“PKCS12密钥存储支持以下变体: PKCS12-3DES-3DES:默认情况下,对任何加密任务使用三重DES。”那么,我们可以使用任何这种机制读取PKCS12并声称我们符合FIPS标准吗?
迁移到BCFKS是一个很大的练习,它可能会带来兼容性问题。
-钱德拉
您的问题“如果我们可以在BC-FIPS批准模式下阅读PKCS12密钥存储”的简短答案是否定的。
四个月前,您在这里提出了(几乎)相同的问题:PKCS#12密钥库格式的Bouncy Castle FIPS模式,您从@Peter Dettmann那里得到了答案:
Quoting from the BC-FJA user guide, section "7. Key Stores":
The PKCS12 key store is **not available** in approved-mode of operation due to the algorithms required for PBE key generation in the PKCS#12 standard.
It is available only to threads that are not running in approved-mode.
下面是BC FIPS示例(“KeyStr.java”)的精简版本,该示例首先在禁用的approved模式下运行,然后我将启用该模式-您将收到一条错误消息:
Testing a PKCS12 keystore with BC FIPS in approved mode
running in approved mode: false
PKCS12 (certificate): true
running in approved mode: true
Exception in thread "main" org.bouncycastle.jcajce.provider.ProvIOException: exception decrypting data - java.security.NoSuchAlgorithmException: No such algorithm: 1.2.840.113549.1.12.1.3
...
以下代码仅用于教育目的,可能不安全。
import org.bouncycastle.asn1.x500.X500Name;
import org.bouncycastle.cert.X509v1CertificateBuilder;
import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter;
import org.bouncycastle.cert.jcajce.JcaX509v1CertificateBuilder;
import org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider;
import org.bouncycastle.operator.OperatorCreationException;
import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder;
import org.bouncycastle.pkcs.PKCSException;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.security.*;
import java.security.cert.X509Certificate;
import java.util.Date;
public class Pkcs12KeystoreFipsApprovedMode
{
public static byte[] storeCertificatePkcs12(char[] storePassword, X509Certificate trustedCert)
throws GeneralSecurityException, IOException {
KeyStore keyStore = KeyStore.getInstance("PKCS12", "BCFIPS");
keyStore.load(null, null);
keyStore.setCertificateEntry("trustedca", trustedCert);
ByteArrayOutputStream bOut = new ByteArrayOutputStream();
keyStore.store(bOut, storePassword);
return bOut.toByteArray();
}
private static KeyStore rebuildStore(String storeType, char[] storePassword, byte[] encoding)
throws GeneralSecurityException, IOException {
KeyStore keyStore = KeyStore.getInstance(storeType, "BCFIPS");
keyStore.load(new ByteArrayInputStream(encoding), storePassword);
return keyStore;
}
public static void main(String[] args)
throws GeneralSecurityException, OperatorCreationException, PKCSException, IOException
{
Security.addProvider(new BouncyCastleFipsProvider());
System.out.println("Testing a PKCS12 keystore with BC FIPS in approved mode\n");
System.out.println("running in approved mode: " + org.bouncycastle.crypto.CryptoServicesRegistrar.isInApprovedOnlyMode());
KeyPair caKeyPair = generateKeyPair();
X509Certificate caCert = makeV1Certificate(caKeyPair.getPrivate(), caKeyPair.getPublic());
char[] storePass = "storePassword".toCharArray();
System.out.println("PKCS12 (certificate): " + rebuildStore("PKCS12", storePass, storeCertificatePkcs12(storePass, caCert)).isCertificateEntry("trustedca"));
// running now in approved mode
org.bouncycastle.crypto.CryptoServicesRegistrar.setApprovedOnlyMode(true);
System.out.println("running in approved mode: " + org.bouncycastle.crypto.CryptoServicesRegistrar.isInApprovedOnlyMode());
System.out.println("PKCS12 (certificate): " + rebuildStore("PKCS12", storePass, storeCertificatePkcs12(storePass, caCert)).isCertificateEntry("trustedca2"));
}
public static KeyPair generateKeyPair() throws GeneralSecurityException {
KeyPairGenerator keyPair = KeyPairGenerator.getInstance("EC", "BCFIPS");
keyPair.initialize(384);
return keyPair.generateKeyPair();
}
public static X509Certificate makeV1Certificate(PrivateKey caSignerKey, PublicKey caPublicKey)
throws GeneralSecurityException, OperatorCreationException {
long THIRTY_DAYS = 1000L * 60 * 60 * 24 * 30;
X509v1CertificateBuilder v1CertBldr = new JcaX509v1CertificateBuilder(
new X500Name("CN=Issuer CA"),
BigInteger.valueOf(System.currentTimeMillis()),
new Date(System.currentTimeMillis() - 1000L * 5),
new Date(System.currentTimeMillis() + THIRTY_DAYS),
new X500Name("CN=Issuer CA"),
caPublicKey);
JcaContentSignerBuilder signerBuilder = new JcaContentSignerBuilder("SHA384withECDSA").setProvider("BCFIPS");
return new JcaX509CertificateConverter().setProvider("BCFIPS").getCertificate(v1CertBldr.build(signerBuilder.build(caSignerKey)));
}
}
根据Bouncy Castle FIPS Java API指南,版本:0.1 在第4.2节中,一些填充机制被指定与公钥算法(ElGamal/RSA)一起使用: 不添加 OAEPWITHA-1和MGF1PADDING-别名:OAEPWITHSHA1和MGF1PADDING,OAEPADDING。 oaepwithsha-224andmgf1padding-别名:oaepwithsha224andmg
我一直在尝试通过Bouncy Castle使用OpenPGP构建内存中的公钥加密基础设施。我们的一家供应商使用OpenPGP公钥加密来加密他们的所有提要,并要求我们也这样做,所以我被技术和实现卡住了。所以现在我正在编写一个OpenPGP加密/解密工具包来自动化这些提要。 bouncycastle.org的例子莫名其妙地默认将加密数据写入文件系统并从其中收集密钥;这不是我想做的,所以我一直试图让一切
使用PEM证书,如 我的问题是,AFAIK,pemparser中没有密码的位置。 有人能给我一个如何将代码迁移到PEMParser版本的例子吗?
Ladar Levison编写了ecies_encrypt和ecies_decrypt C函数。这些功能与ECIES弹力城堡兼容吗?如果不是,有没有人知道要修复什么或者ecies的另一个C实现?
我的程序生成AES密钥,用rsa算法加密并发送到服务器。但是,当我从服务器获取它并解密时,一些字节被破坏并替换为序列,根据这个问题UTF-8编码和解码问题,我意识到问题是服务器(也解密密钥)将其存储为UTF-8字符串。有没有办法创建“UTF-8友好”键?现在如何生成密钥:
我知道曲线名称()以及EC公钥的和坐标。 如何用它们创建? 我读过https://stackoverflow.com/a/29355749/5453873,但是那里的代码使用而不是,ECPublicKey是中的接口,而不是一个可实例化的类。