【发布时间】:2015-03-12 09:23:11
【问题描述】:
我使用 flexiprovider 使用基于椭圆曲线的非对称算法进行加密/解密,遵循 tutorial。稍作修改,我将出于个人目的(例如存储到数据库或文本文件中)将公钥和私钥转换为 Base64。我也在看这个question,答案是参考这个thread。但是我的代码是为 dekstop 而不是在 android 设备中运行,我认为 java 中的 android 和 dekstop 版本有很大的不同(只是为了清理我的问题信息)。好的,在我的代码中,当我要从生成的公钥创建格式化的公钥时出现错误(我认为当我尝试为私钥执行此操作时会发生同样的问题)。 现在,这是我的代码:
- 密钥对生成器类。
import org.jivesoftware.smack.util.Base64; //or whatever to convert into Base64
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.Security;
import java.security.KeyFactory;
import javax.crypto.Cipher;
import de.flexiprovider.common.ies.IESParameterSpec;
import de.flexiprovider.core.FlexiCoreProvider;
import de.flexiprovider.ec.FlexiECProvider;
import de.flexiprovider.ec.parameters.CurveParams;
import de.flexiprovider.ec.parameters.CurveRegistry.BrainpoolP160r1;
import de.flexiprovider.pki.PKCS8EncodedKeySpec;
import de.flexiprovider.pki.X509EncodedKeySpec;
...
Security.addProvider(new FlexiCoreProvider());
Security.addProvider(new FlexiECProvider());
KeyPairGenerator kpg = KeyPairGenerator.getInstance("ECIES","FlexiEC");
CurveParams ecParams = new BrainpoolP160r1();
kpg.initialize(ecParams, new SecureRandom());
KeyPair keyPair = kpg.generateKeyPair();
PublicKey pubKey = keyPair.getPublic();
byte[] encod_pubK = pubKey.getEncoded();
String publicKey = Base64.encodeBytes(encod_pubK);
System.out.println("Public Key :" +publikKey);
PrivateKey privKey = keyPair.getPrivate();
byte[] encod_privK = privKey.getEncoded();
String privateKey = Base64.encodeBytes(encod_privK);
System.out.println("Private Key :" +privateKey);
从上面的代码中,我将存储字符串“privateKey”和“publicKey”。现在我要加密消息。
- 发送方
import (same as code above)
...
Security.addProvider(new FlexiCoreProvider());
Security.addProvider(new FlexiECProvider());
Cipher cipher = Cipher.getInstance("ECIES","FlexiEC");
IESParameterSpec iesParams = new IESParameterSpec ("AES128_CBC","HmacSHA1", null, null);
byte[] decodedPubKey = Base64.decode(publicKey);
X509EncodedKeySpec formatted_public = new X509EncodedKeySpec(decodedPubKey);
KeyFactory kf = KeyFactory.getInstance("ECIES","FlexiEC");
PublicKey publicKey = kf.generatePublic(formatted_public); // <--- I got error when hit this row
cipher.init(Cipher.ENCRYPT_MODE, publicKey, iesParams);
byte[] block = "this my message".getBytes();
System.out.println("Plaintext: "+ new String(block));
byte [] Ciphered = cipher.doFinal(block);
System.out.println("Ciphertext : "+ Base64.encodeBytes(Ciphered));
来自上述发件人代码的错误是:
Exception in thread "main" de.flexiprovider.api.exceptions.InvalidKeySpecException: java.lang.RuntimeException: java.security.InvalidAlgorithmParameterException: Caught IOException("Unknown named curve: 1.3.36.3.3.2.8.1.1.1")
at de.flexiprovider.ec.keys.ECKeyFactory.generatePublic(ECKeyFactory.java:205)
at de.flexiprovider.api.keys.KeyFactory.engineGeneratePublic(KeyFactory.java:39)
at java.security.KeyFactory.generatePublic(KeyFactory.java:328)
如何使用该命名曲线生成该公钥: 1.3.36.3.3.2.8.1.1.1 ?
- 接收方(仅供参考)
如果发件人已成功加密邮件,现在我要解密邮件,这是我的代码(但不确定它是否像上面的发件人代码那样运行时没有错误):
byte[] decodedPrivateKey = Base64.decode(privateKey);
PKCS8EncodedKeySpec formatted_private = new PKCS8EncodedKeySpec(decodedPrivateKey);
cipher.init(Cipher.DECRYPT_MODE, privKey, iesParams);
byte[] decryptedCipher = cipher.doFinal(Ciphered);
System.out.println("Decrypted message : "+ new String (decryptedCipher));
【问题讨论】:
-
在此link 之后,我可以找到以“brainpoolP160r1”命名的“1.3.36.3.3.2.8.1.1.1”或 160 位曲线,但为什么错误说(“未知命名曲线:1.3.36.3 .3.2.8.1.1.1") ?我正在为我的 jdk-8 添加 jce 8,但仍然遇到这个问题
标签: java cryptography encryption-asymmetric