- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
目前我需要为 GOST 34.10-2001 签名算法生成一个 key 对。很高兴发现充气城堡提供商支持此算法,但我无法生成 key 对并将其保存到任何类型的任何 keystore 。目前我尝试了这个命令(如果 keyalg
是 DSA
并且 sigalg 是 SHA1withDSA
,这个命令效果很好):
keytool -genkey -alias test1 -keyalg ECGOST3410 -keysize 512 -sigalg GOST3411withECGOST3410 \
-keypass test_1 -validity 1000 -storetype JKS -keystore test1.jks -storepass test_1 -v \
-provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "bcprov-jdk16-1.46.jar"
但是我有一个错误:
keytool error: java.lang.IllegalArgumentException: unknown key size.
java.lang.IllegalArgumentException: unknown key size.
at sun.security.x509.CertAndKeyGen.generate(CertAndKeyGen.java:134)
at sun.security.tools.KeyTool.doGenKeyPair(KeyTool.java:1156)
at sun.security.tools.KeyTool.doCommands(KeyTool.java:786)
at sun.security.tools.KeyTool.run(KeyTool.java:172)
at sun.security.tools.KeyTool.main(KeyTool.java:166)
当我尝试操作 keysize 或从命令中删除 keysize
选项时,我看到的错误完全相同。但是有一些特殊情况。当我将 keysize
设置为 256
时,我遇到了另一个错误:
keytool error: java.lang.IllegalArgumentException: key size not configurable.
java.lang.IllegalArgumentException: key size not configurable.
at sun.security.x509.CertAndKeyGen.generate(CertAndKeyGen.java:134)
at sun.security.tools.KeyTool.doGenKeyPair(KeyTool.java:1156)
at sun.security.tools.KeyTool.doCommands(KeyTool.java:786)
at sun.security.tools.KeyTool.run(KeyTool.java:172)
at sun.security.tools.KeyTool.main(KeyTool.java:166)
目前我不知道如何生成 key 对以及如何将其保存到 keystore 。我还有一些 Java 代码可以为 GOST 34.10-2001 算法生成 key 对:
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
KeyPairGenerator kpg = KeyPairGenerator.getInstance("ECGOST3410", "BC");
kpg.initialize(new ECGenParameterSpec("GostR3410-2001-CryptoPro-A"));
KeyPair kp = kpg.generateKeyPair();
此代码示例使用 ECGenParameterSpec
类来初始化 key 对生成器,因此我可能应该以某种方式将它提供给 key 工具(-providerArg provider_arg
或 - Jjava选项
)?
附言我认为我应该提供曲线名称作为某些参数,但我无法确定应该使用哪个参数。
最佳答案
您将无法使用 keytool 和 BC 创建带有 GOST3410 key 的 keystore 。
keytool 使用的sun.security.x509.CertAndKeyGen
类不提供使用参数初始化 key 生成器的选项,而 BC GOST3410 key generator需要使用 ECParameterSpec
进行初始化。
您可以创建 key 对+证书并以编程方式将它们放入 keystore :
Security.addProvider( new org.bouncycastle.jce.provider.BouncyCastleProvider() );
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance( "ECGOST3410", "BC" );
keyPairGenerator.initialize( new ECGenParameterSpec( "GostR3410-2001-CryptoPro-A" ) );
KeyPair keyPair = keyPairGenerator.generateKeyPair();
org.bouncycastle.asn1.x500.X500Name subject = new org.bouncycastle.asn1.x500.X500Name( "CN=Me" );
org.bouncycastle.asn1.x500.X500Name issuer = subject; // self-signed
BigInteger serial = BigInteger.ONE; // serial number for self-signed does not matter a lot
Date notBefore = new Date();
Date notAfter = new Date( notBefore.getTime() + TimeUnit.DAYS.toMillis( 365 ) );
org.bouncycastle.cert.X509v3CertificateBuilder certificateBuilder = new org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder(
issuer, serial,
notBefore, notAfter,
subject, keyPair.getPublic()
);
org.bouncycastle.cert.X509CertificateHolder certificateHolder = certificateBuilder.build(
new org.bouncycastle.operator.jcajce.JcaContentSignerBuilder( "GOST3411withECGOST3410" )
.build( keyPair.getPrivate() )
);
org.bouncycastle.cert.jcajce.JcaX509CertificateConverter certificateConverter = new org.bouncycastle.cert.jcajce.JcaX509CertificateConverter();
X509Certificate certificate = certificateConverter.getCertificate( certificateHolder );
KeyStore keyStore = KeyStore.getInstance( "JKS" );
keyStore.load( null, null ); // initialize new keystore
keyStore.setEntry(
"alias",
new KeyStore.PrivateKeyEntry(
keyPair.getPrivate(),
new Certificate[] { certificate }
),
new KeyStore.PasswordProtection( "entryPassword".toCharArray() )
);
keyStore.store( new FileOutputStream( "test.jks" ), "keystorePassword".toCharArray() );
关于java - 生成 GOST 34.10-2001 key 对并将其保存到某个 keystore ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14580340/
我正在尝试使用 OpenSSL 1.0.0d 实现 ECDH key 交换 GOST 34.10-2001。我正在像这样加载 gost 引擎: ENGINE * e = ENGINE_by_i
我想使用 OpenSSL 生成私有(private)/公共(public)/(证书签名请求)并稍后签署一些数据。但我想用OpenSSL GOST engine . 我下载了 OpenSSL 1.0.0
如果有办法以编程方式将自定义参数插入 GOST 2001 参数集,应该使用什么 API?通过模拟 OpenSSL 的功能设法生成 EVP_PKEY 后,我发现参数绑定(bind)到 NID,因此需要在
我对静态链接的 openSSL 库和 GOST 加密引擎有疑问。 我有使用 GOST key 和证书的简单客户端/服务器应用程序。 它适用于 GOST key ,但前提是我使用 openSSL 库的动
我正在尝试安装SoftHSM如图here ,这需要 OpenSSL。所以我安装了OpenSSL v1.0.2j,但它似乎没有捆绑GOST支持,或者至少我在/usr/lib/openssl/中找不到li
我想在我的客户端密码列表中使用 GOST 密码的同时使用 Java 客户端与某些 Web 服务器建立 SSL 连接。我尝试使用 getEnabledCipherSuites() 和 getSuppor
我正在尝试使用 C 手动编写 GOST 哈希函数。我发现了 Markku-Juhani Saarinen(来自 link)的以下代码。 /* * gosthash.c * 21 Apr 199
我有我的证书、源文档、Base64 格式的分离签名。由 UEC(通用电子卡 - 俄罗斯智能卡项目)在 Windows 上的 CryptoARM 程序中创建的签名(我认为 GOST hash funct
我试图强制 python 2.7 使用修改后的 openssl 库。我需要支持俄罗斯 GOST 密码。所以我像这样配置 OpenSSL ./config shared zlib enable-rfc3
美好的一天!我正在尝试根据来自客户端的 post 请求的十六进制字符串创建公钥 ObjectHandle。 我正在根据文档进行操作,但它返回给我 CKR_ATTRIBUTE_TYPE_INVALID
目前我需要为 GOST 34.10-2001 签名算法生成一个 key 对。很高兴发现充气城堡提供商支持此算法,但我无法生成 key 对并将其保存到任何类型的任何 keystore 。目前我尝试了这个
我正在尝试实现 gost 28147-89 算法来加密和解密字符串。 在 bouncycaSTLe 文档中,我不明白如何实现 gost 28147。如何制作一个使用 gost 28147-89 算法加
我是一名优秀的程序员,十分优秀!