【问题标题】:ECC algorithm key mismatchECC 算法密钥不匹配
【发布时间】:2015-06-13 17:35:48
【问题描述】:

我正在尝试在 Android 上实现 ECC 算法。我目前正在使用海绵城堡来实现它。

密钥生成锥sn-p如下:

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。这是使用正确的罐子吗?如果没有,请推荐一个更好的。

另外,我应该如何纠正我的代码以使其正常工作?

【问题讨论】:

    标签: android cryptography public-key-encryption spongycastle


    【解决方案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");
    

    【讨论】:

    • 你能分享代码的链接或者你在哪里找到代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    • 2018-09-13
    相关资源
    最近更新 更多