0

Я пытаюсь реализовать алгоритм ECC на 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"); 

Вот так я использую (IESKey) отливку для частного и публичного ключа в c.init() i получить ошибку

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. Является ли это подходящей баночкой? Если нет, предложите лучше.

Также как исправить мой код, чтобы заставить его работать?

ответ

0

Я нашел решение ... Вот код, который работает

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"); 
+0

Не могли бы вы поделиться ссылкой кода или где вы нашли код. – Mayank

Смежные вопросы