【问题标题】:decode south african za-drivers-license解码南非 za 驾驶执照
【发布时间】:2017-08-07 11:10:37
【问题描述】:

参考本次讨论:Decode South African (ZA) Drivers License

请协助我在 android 上尝试在 Java 中创建 PublicKey 实例时似乎遇到了错误。我在下面粘贴了错误:

java.lang.RuntimeException: error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag

这里是sn-p的代码:

Cipher asymmetricCipher = null;
asymmetricCipher = Cipher.getInstance("RSA");
X509EncodedKeySpec publicKeySpec128 = new X509EncodedKeySpec(key128block);
X509EncodedKeySpec publicKeySpec74 = new X509EncodedKeySpec(key74block);

KeyFactory keyFactory = KeyFactory.getInstance("RSA");
Key key = keyFactory.generatePublic(publicKeySpec128);
asymmetricCipher.init(Cipher.DECRYPT_MODE, key);

byte[] plainText = asymmetricCipher.doFinal(topBlocksData[0]);

【问题讨论】:

  • 看起来密钥格式不正确。是不是忘了去掉一层 Base64 编码?
  • key128block = Base64.decode(keys[2].replaceAll("-----(BEGIN|END) RSA PUBLIC KEY-----", "").replaceAll("\ n", "").getBytes(), Base64.DEFAULT);
  • @anos 您使用此代码成功扫描了吗?
  • 我使用了不同的方法。但请检查@james-k-polk 的答案
  • @AnosK.Mhazo 您提取了多少信息?您是否也设法获得了图像?

标签: java android encryption rsa public-key


【解决方案1】:

您尝试读取的编码公钥不是X509EncodedKeySpec 所期望的格式。相反,它们具有更简单的形式,不幸的是,Java 不支持这种形式。但是,您可以使用 Bouncycastle 或 Spongycastle 库编写一个小型 Java 例程来解析值。下面的代码从my answer复制到this question

import java.io.IOException;
import java.math.BigInteger;
import org.bouncycastle.asn1.ASN1EncodableVector;
import org.bouncycastle.asn1.ASN1InputStream;
import org.bouncycastle.asn1.ASN1Integer;
import org.bouncycastle.asn1.DERSequence;
import org.bouncycastle.asn1.DLSequence;

public class RsaAsn1Example {
// ...
    public static BigInteger [] parseASN1RsaPublicKey(byte [] encoded) throws IOException {
        ASN1InputStream asn1_is = new ASN1InputStream(encoded);
        DLSequence dlSeq = (DLSequence) asn1_is.readObject();
        ASN1Integer asn1_n = (ASN1Integer) dlSeq.getObjectAt(0);
        ASN1Integer asn1_e = (ASN1Integer) dlSeq.getObjectAt(1);
        asn1_is.close();
        return new BigInteger[]{ asn1_n.getPositiveValue(), asn1_e.getPositiveValue()};
    }
// ....
}

parseASN1RsaPublicKey 返回的值可以提供给RsaPublicKeySpec 构造函数以创建公钥。

同时检查divanov's answer 到相同的问题以寻找替代方案。

【讨论】:

    猜你喜欢
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 2012-12-27
    • 2022-06-22
    相关资源
    最近更新 更多