【问题标题】:java.lang.RuntimeException: error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tagjava.lang.RuntimeException:错误:0D0680A8:asn1 编码例程:ASN1_CHECK_TLEN:错误标记
【发布时间】:2014-04-03 15:27:59
【问题描述】:

我收到此错误(在标题中)。我不知道为什么,请帮忙。代码如下:

public static String decryptRSA(Context mContext, byte[] message) throws Exception { 


    InputStream in = mContext.getResources().openRawResource(R.raw.publicrsakey);
    X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(org.apache.commons.io.IOUtils.toByteArray(in));

    PublicKey publicKey = 
            KeyFactory.getInstance("RSA").generatePublic(x509EncodedKeySpec);

    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.ENCRYPT_MODE, publicKey);
    final String encryptedString = Base64.encode(cipher.doFinal(message));

    return encryptedString;


}   

编辑。最后,我使用扩展名为 .der 的公钥文件(之前是 .crt)解决了这个问题,并且有效的代码是:

InputStream in = mContext.getResources().openRawResource(R.raw.key);

        CertificateFactory cf = CertificateFactory.getInstance("X509");
        Certificate cert = cf.generateCertificate(new ByteArrayInputStream(org.apache.commons.io.IOUtils.toByteArray(in)));
        PublicKey pubKey = cert.getPublicKey();
        try
        {
            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");            
            cipher.init(Cipher.ENCRYPT_MODE, pubKey);
            final String encryptedString = Base64.encode(cipher.doFinal(message));
            return encryptedString;
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return "";   

但是“divanov”回答了我提出的问题。

【问题讨论】:

    标签: java android public-key-encryption


    【解决方案1】:

    Exception error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag 表示

    InputStream in = mContext.getResources().openRawResource(R.raw.publicrsakey);
    byte[] pubKeyBytes = org.apache.commons.io.IOUtils.toByteArray(in);
    

    不代表ASN.1 DER 编码消息。将其打印为十六进制以验证确切的问题

    Log.v("HEX", org.apache.commons.codec.binary.Hex.encodeHexString(pubKeyBytes);
    

    【讨论】:

    • 响应字符串是 3082040d308202f5a003020102020900faebd97c3cbce29d300d06092a864886f70d010105050030819c310b3009060355504061302553 什么的
    • 1.2.840.113549.1.1.5 是 sha1-with-rsa-signature 的 OID,而公钥 OID 应为 1.2.840.113549.1.1.1。另外,它不是 ASN.1 DER。看起来这是公钥证书,而不是 X.509 编码的公钥。
    • andorid中没有这种方法Hex.encodeHexString
    • 你能看看这个SO问题stackoverflow.com/questions/46812752/…
    猜你喜欢
    • 2019-10-17
    • 1970-01-01
    • 2020-11-01
    • 2019-08-23
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 2015-07-07
    相关资源
    最近更新 更多