java - 解码南非 za 驾驶执照

标签 java android encryption rsa public-key

引用此讨论:Decode South African (ZA) Drivers License

请协助我尝试在 Android 上的 Java 中创建 PublicKey 实例时似乎遇到错误。我已粘贴以下错误:

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

这是代码 fragment :

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]);

最佳答案

您尝试读取的编码公钥不符合 X509EncodedKeySpec 预期的格式。相反,它们具有更简单的形式,不幸的是,Java 不支持这种形式。但是,您可以使用 BouncycaSTLe 或 SpongycaSTLe 库编写一个小型 java 例程来解析这些值。下面的代码复制自my answerthis 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相同的问题以寻求替代方案。

关于java - 解码南非 za 驾驶执照,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42831339/

相关文章:

c - DES 加密和密码模式

java - 如何获得 Java g.drawString() 高分辨率?

java - Spring Boot 下拉菜单

android - 使用适配器、助手创建或访问数据库有什么好处?

android - 在 Android Studio 上获取 "Can' t 确定标签类型

android - 如何从 OrientationEventListener 获取 boolean 类型的返回值?

ios - 使用 Diffie Hellman key 交换和椭圆曲线加密进行快速加密

java - 如何使我的 HTML 和 java 表单重定向到自身,以便用户可以输入另一个项目?

java - 如何让 Jersey 2/Spring 4 在没有 web.xml 配置的情况下从 @Configuration 加载 beans

c# - 在 winrt c# 中加密字符串并在 c# .net 中解密