Несоответствие ключа алгоритма ECC
Я пытаюсь реализовать алгоритм ECC на Android. В настоящее время я использую губчатый замок для его реализации.
Фрагмент конуса генерации ключа выглядит следующим образом:
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");
Здесь, так как я использую (IESKey) приведение для закрытого и открытого ключа в c.init(), я получаю ошибку
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. Это правильная банка для использования? Если нет, пожалуйста, предложите лучший.
Кроме того, как я должен исправить свой код, чтобы он работал?
1 ответ
Я нашел решение... Вот код, который работает
Security.insertProviderAt(new org.spongycastle.jce.provider.BouncyCastleProvider(), 1);
ECGenParameterSpec brainpoolP160R1 = new ECGenParameterSpec("brainpoolP256t1");
KeyPairGenerator kpg = null;
try {
kpg = (KeyPairGenerator) KeyPairGenerator.getInstance("ECIES", "SC");
} catch (NoSuchAlgorithmException | NoSuchProviderException e) {
e.printStackTrace();
}
try {
kpg.initialize(brainpoolP160R1, new SecureRandom());
} catch (InvalidAlgorithmParameterException e) {
e.printStackTrace();
}
KeyPair akey = kpg.generateKeyPair();
KeyPair bkey = kpg.generateKeyPair();
// PublicKey publicKey = keyPair.getPublic();
//PrivateKey privateKey = keyPair.getPrivate();
byte[] d = new byte[]{1, 2, 3, 4, 5, 6, 7, 8};
byte[] e = new byte[]{8, 7, 6, 5, 4, 3, 2, 1};
IESParameterSpec param = new IESParameterSpec(d, e, 256);
Cipher c = null;
try {
c = Cipher.getInstance("ECIES");
} catch (NoSuchAlgorithmException | NoSuchPaddingException f) {
f.printStackTrace();
}
try {
c.init(Cipher.ENCRYPT_MODE, new IEKeySpec(akey.getPrivate(), bkey.getPublic()), param);
//c.init(Cipher.ENCRYPT_MODE, c1Key, param);
//c.init(Cipher.ENCRYPT_MODE, publicKey, new SecureRandom());
// How can i put the AES128_CBC for ies parameter ? is that possible
} catch (InvalidKeyException | InvalidAlgorithmParameterException f) {
f.printStackTrace();
}
byte[] message = theTestText.getBytes();
byte[] cipher = new byte[0];
try {
cipher = c.doFinal(message);//,0,message.length);
} catch (IllegalBlockSizeException | BadPaddingException f) {
f.printStackTrace();
}
TextView eccencoded = (TextView) findViewById(R.id.eccencoded);
eccencoded.setText("[ENCODED]:\n" +
new String(cipher) + "\n");
try {
c.init(Cipher.DECRYPT_MODE, new IEKeySpec(bkey.getPrivate(), akey.getPublic()), param);
} catch (InvalidKeyException | InvalidAlgorithmParameterException f) {
f.printStackTrace();
}
byte[] plaintext = new byte[0];
try {
plaintext = c.doFinal(cipher);
} catch (IllegalBlockSizeException | BadPaddingException f) {
f.printStackTrace();
}
TextView eccdecoded = (TextView) findViewById(R.id.eccdecoded);
eccdecoded.setText("[DECODED]:\n" +
new String(plaintext) + "\n");