我正在尝试在 Android 上实现 ECC 算法。我目前正在使用海绵城堡来实现它。
密钥生成锥片段如下:
KeyPairGenerator kpg = null;
try {
kpg = KeyPairGenerator.getInstance("ECIES");// Do i have to do any changes here?
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
ECGenParameterSpec brainpoolP160R1 = new ECGenParameterSpec("brainpoolP160R1");
try {
kpg.initialize(brainpoolP160R1);
} catch (InvalidAlgorithmParameterException) {
}
KeyPair kp = kpg.generateKeyPair();
PublicKey publicKey = kp.getPublic();
PrivateKey privateKey = kp.getPrivate();
加解密代码如下
Cipher c = null;
try {
c =Cipher.getInstance("ECIES", "SC"); //Cipher.getInstance("ECIESwithAES/DHAES/PKCS7Padding", "BC");
} catch (NoSuchAlgorithmException | NoSuchPaddingException | NoSuchProviderException e) {
e.printStackTrace();
}
try {
c.init(Cipher.ENCRYPT_MODE,(IESKey)publicKey , new SecureRandom());
} catch (InvalidKeyException e) {
e.printStackTrace();
}
byte[] message = "hello world -- a nice day today".getBytes();
byte[] cipher = new byte[0];
try {
cipher = c.doFinal(message,0,message.length);
} catch (IllegalBlockSizeException | BadPaddingException e) {
e.printStackTrace();
}
// System.out.println("Ciphertext : "+ Base64.encode(cipher));
TextView eccencoded = (TextView) findViewById(R.id.eccencoded);
eccencoded.setText("[ENCODED]:\n" +
Base64.encodeToString(cipher, Base64.DEFAULT) + "\n");
try {
c.init(Cipher.DECRYPT_MODE,(IESKey) privateKey, new SecureRandom());
} catch (InvalidKeyException e) {
e.printStackTrace();
}
byte[] plaintext = new byte[0];
try {
plaintext = c.doFinal(cipher,0,cipher.length);
} catch (IllegalBlockSizeException | BadPaddingException e) {
e.printStackTrace();
}
TextView eccdecoded = (TextView) findViewById(R.id.eccdecoded);
eccdecoded.setText("[DECODED]:\n" +
Base64.encodeToString(plaintext, Base64.DEFAULT) + "\n");
在这里,因为我在c.init()中使用 (IESKey) 转换私钥和公钥,所以我得到了错误
java.lang.ClassCastException:org.spongycastle.jce.provider.JCEECPublicKey cannot be cast to org.spongycastle.jce.interfaces.IESKey
如果我删除演员表,我会收到这样的错误
c.init(Cipher.DECRYPT_MODE, privateKey, new SecureRandom());
我得到错误
java.security.InvalidKeyException: must be passed IES key
如果我使用,我会得到算法未找到错误
Cipher.getInstance("ECIESwithAES/DHAES/PKCS7Padding", "SC");
我正在使用scprov-jdk15-1.46.99.3-UNOFFICIAL-ROBERTO-RELEASE.jar。这是使用正确的罐子吗?如果没有请推荐一个更好的。
另外我应该如何纠正我的代码以使其正常工作?