当前位置: 首页 > 知识库问答 >
问题:

ECC加解密中Base64编/解码

尹昀
2023-03-14

我想测试ECC算法的加密和解密。

我编写代码用于:

/// generate key pair
ECNamedCurveParameterSpec spec = ECNamedCurveTable.getParameterSpec("prime256v1");
try 
{
    KeyPairGenerator g = KeyPairGenerator.getInstance("ECDSA",BouncyCastleProvider.PROVIDER_NAME);
    g.initialize(spec, new SecureRandom());
    KeyPair keyPair = g.generateKeyPair();
    privateKey = keyPair.getPrivate();
    publicKey = keyPair.getPublic();
    System.out.println("PublicKey:"+publicKey+"\n");
    System.out.println("PrivateKey:"+privateKey+"\n");

} 
catch (Exception e) 
{
    e.printStackTrace();
}
 try {
    Cipher c = Cipher.getInstance("ECIES",BouncyCastleProvider.PROVIDER_NAME);
    c.init(Cipher.ENCRYPT_MODE,publicKey);
    encodeBytes = c.doFinal(origin.getBytes());
    String encrypt = Base64.getEncoder().encodeToString(encodeBytes);
    System.out.println(encrypt);
} catch (Exception e) {
    e.printStackTrace();
}

我的输出加密字符串如下所示:

BB9Y4sKPbp28y7+FnpGnLGz5aTjD58GiIcXgjnNC4nXlUiqlHVVPc4K+ovlK5HK+Hz1Qps4ZWH9VdoYvm6VE36aEqvy53lJFnANDVpqAKuDUUaqEUrIQgF/TXFCFO22Il411atDsNhvJC3eRXbREL14duQbF8xjnLjru6WLN6GDYAQ==

这是我的私钥

-----BEGIN PRIVATE KEY-----
MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQgCybVICafKcZiEmGNw+Pj/FfL6GMgDc94/E0zJ/EKgdGgCgYIKoZIzj0DAQehRANCAATRTcV/M0OJE94qlZM7VksMOw35fcuGSxejdgzbyYllWtlIQw9gYhKPZx6t/PVOEOec4DyZq2XwaoNxBxWRboL1
-----END PRIVATE KEY-----

在Android上解密字符串

encodeBytes = Base64.decode(encrypted_string_above,Base64.DEFAULT);
try
        {
            KeyFactory factory = KeyFactory.getInstance("ECDSA", "SC");

            String state;
            state = Environment.getExternalStorageState();
            File root = Environment.getExternalStorageDirectory();
            File dir = new File(root.getAbsolutePath()+"/disk");
            privateKeyFromFile = generatePrivateKey(factory,dir+"/private.pem");

            Cipher c = Cipher.getInstance("ECIES","SC");
            c.init(Cipher.DECRYPT_MODE,privateKeyFromFile);
            decodeBytes = c.doFinal(encodeBytes);
            String deCrypt = new String(decodeBytes,"UTF-8");


            txtHiden.setText(deCrypt);
            Toast.makeText(activity, deCrypt, Toast.LENGTH_SHORT).show();
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
  10-03 00:52:18.264 28656-28656/com.example.napoleon.luanvana W/System.err: org.spongycastle.jcajce.provider.util.BadBlockException: unable to process block
  10-03 00:52:18.264 28656-28656/com.example.napoleon.luanvana W/System.err:     at org.spongycastle.jcajce.provider.asymmetric.ec.IESCipher.engineDoFinal(IESCipher.java:476)
  10-03 00:52:18.264 28656-28656/com.example.napoleon.luanvana W/System.err:     at javax.crypto.Cipher.doFinal(Cipher.java:2056)
  10-03 00:52:18.264 28656-28656/com.example.napoleon.luanvana W/System.err:     at com.example.napoleon.luanvana.MessageFragment$3.onClick(MessageFragment.java:156)
  10-03 00:52:18.265 28656-28656/com.example.napoleon.luanvana W/System.err:     at android.view.View.performClick(View.java:6213)
  10-03 00:52:18.265 28656-28656/com.example.napoleon.luanvana W/System.err:     at android.widget.TextView.performClick(TextView.java:11074)
  10-03 00:52:18.265 28656-28656/com.example.napoleon.luanvana W/System.err:     at android.view.View$PerformClick.run(View.java:23645)
  10-03 00:52:18.265 28656-28656/com.example.napoleon.luanvana W/System.err:     at android.os.Handler.handleCallback(Handler.java:751)
  10-03 00:52:18.265 28656-28656/com.example.napoleon.luanvana W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
  10-03 00:52:18.265 28656-28656/com.example.napoleon.luanvana W/System.err:     at android.os.Looper.loop(Looper.java:154)
  10-03 00:52:18.265 28656-28656/com.example.napoleon.luanvana W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6692)
  10-03 00:52:18.265 28656-28656/com.example.napoleon.luanvana W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
  10-03 00:52:18.265 28656-28656/com.example.napoleon.luanvana W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
  10-03 00:52:18.265 28656-28656/com.example.napoleon.luanvana W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)
  10-03 00:52:18.265 28656-28656/com.example.napoleon.luanvana W/System.err: Caused by: org.spongycastle.crypto.InvalidCipherTextException: unable to recover ephemeral public key: Sender's public key has invalid point encoding 0x51
  10-03 00:52:18.265 28656-28656/com.example.napoleon.luanvana W/System.err:     at org.spongycastle.crypto.engines.IESEngine.processBlock(IESEngine.java:409)
  10-03 00:52:18.265 28656-28656/com.example.napoleon.luanvana W/System.err:     at org.spongycastle.jcajce.provider.asymmetric.ec.IESCipher.engineDoFinal(IESCipher.java:472)
 10-03 00:52:18.265 28656-28656/com.example.napoleon.luanvana W/System.err:     ... 12 more
 10-03 00:52:18.265 28656-28656/com.example.napoleon.luanvana W/System.err: Caused by: java.io.IOException: Sender's public key has invalid point encoding 0x51
 10-03 00:52:18.265 28656-28656/com.example.napoleon.luanvana W/System.err:     at org.spongycastle.crypto.parsers.ECIESPublicKeyParser.readKey(ECIESPublicKeyParser.java:46)
 10-03 00:52:18.265 28656-28656/com.example.napoleon.luanvana W/System.err:     at org.spongycastle.crypto.engines.IESEngine.processBlock(IESEngine.java:405)
 10-03 00:52:18.265 28656-28656/com.example.napoleon.luanvana W/System.err:     ... 13 more
(Enctypt side)String encrypt = Base64.getEncoder().encodeToString(encodeBytes);
(Decrypt side): encodeBytes = Base64.decode(encrypted_string_above,Base64.DEFAULT);

共有1个答案

虞华翰
2023-03-14

在ECIE方案中,应该使用ECDH作为生成加密/解密密钥对的算法,而不是ECDSA,因为后者是数字签名算法。

KeyPairGenerator g = KeyPairGenerator.getInstance("ECDH",BouncyCastleProvider.PROVIDER)
 类似资料:
  • 本文向大家介绍浅谈Javascript Base64 加密解密,包括了浅谈Javascript Base64 加密解密的使用技巧和注意事项,需要的朋友参考一下 html代码: 效果: 推荐一个Javascript IDE 比Aptana还好用。Komodo IDE(免费版:Komodo Edit,基本功能一样)支持语法高亮,智能感知,还支持perl,python,ruby,nodejs语法等。

  • 介绍 Base64编码是用64(2的6次方)个ASCII字符来表示256(2的8次方)个ASCII字符,也就是三位二进制数组经过编码后变为四位的ASCII字符显示,长度比原来增加1/3。 使用 String a = "伦家是一个非常长的字符串"; //5Lym5a625piv5LiA5Liq6Z2e5bi46ZW/55qE5a2X56ym5Liy String encode = Base64.en

  • 本文向大家介绍java实现Base64加密解密算法,包括了java实现Base64加密解密算法的使用技巧和注意事项,需要的朋友参考一下 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的详细规范。Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就

  • 所以我有一个AES-256-ecb base64字符串,我用在线工具解码了它。然而,我更喜欢命令行,所以我尝试使用命令行来解码它。 这是我尝试过的,但我得到了严重的解密错误 是加密的base64文本 -aes-256-ecb是加密密码 而366a74cb3c959de17d61db30591c39d1是关键 结果应该是另一个base64字符串:

  • 问题内容: 这是我的代码,我不明白为什么解码功能不起作用。 请少有洞察力会很棒。 它给了我:[解码错误-输出不是utf-8] [解码错误-输出不是utf-8] 问题答案: 返回 最大 长度。 此长度对于调整缓冲区大小很有用,但是不会写入缓冲区的一部分,因此将不是有效的UTF-8。 您只需要使用函数返回的实际写入长度即可。

  • 本文向大家介绍go语言base64加密解密的方法,包括了go语言base64加密解密的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了go语言base64加密解密的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的Go语言程序设计有所帮助。