gpt4 book ai didi

java - 导出ASN.1格式,然后用Base64 JAVA编码

转载 作者:行者123 更新时间:2023-11-30 02:30:09 26 4
gpt4 key购买 nike

我想制作一个自定义的 ASN.1 结构,由 3 个 PrintableString 和 1 个 OctetString 组成。我正在使用 BouncyCaSTLe 框架来处理这个问题。

所以我在类中设置了所需的参数,现在我必须以 ASN.1 格式返回这个结构,然后用 Base64 对其进行编码(其参数是 byte[]),然后转换为 PEM 格式。

所以我的问题是,我必须从方法 getASN1format() 返回什么类型的对象?

我的代码:

import org.bouncycastle.asn1.*;
import java.io.IOException;

public class ASN1Handshake1 implements ASN1Encodable {
private DERPrintableString A, B, ID_PASS;
private ASN1OctetString ID_K;

public ASN1Handshake1(String A, String B, String ID_K, String ID_PASS, TTP TTPs ) throws IOException {
this.A = new DERPrintableString(A);
this.B = new DERPrintableString(B);
this.ID_K = new DEROctetString(ID_K.getBytes());
this.ID_PASS = new DERPrintableString(ID_PASS);
}

public ?? getASN1format(){
//TODO
}

@Override
public ASN1Primitive toASN1Primitive() {
return null;
}
}

最佳答案

我在此代码中使用 Bouncy CaSTLe 1.57 (bcprov-jdk15on)。

首先,请记住,ASN.1 本身并不是一种格式,而是一个 description language 定义结构,并且 PEM is a format that uses base 64 。许多密码学标准使用 ASN.1 来定义其数据结构,而 PEM 或 DER (Distinguished Encoding Rules)序列化这些结构。

所以,如果你想获取ASN.1结构并将其格式化为base64,你可以按照下面的操作。您不需要 getASN1format 方法,只需使用现有的方法即可。

ASN.1 结构中的字段不能只是“松散”。所以我决定将它们放在一个序列中(使用 org.bouncycaSTLe.asn1.DERSequence 类),这是存储结构体字段的最佳选择。我按照声明的顺序排列它们,但当然您可以选择任何您想要的顺序。

我还更改了变量名称以遵循 Java's code conventions (名称以小写字母开头)。所以类代码是:

import org.bouncycastle.asn1.ASN1Encodable;
import org.bouncycastle.asn1.ASN1Object;
import org.bouncycastle.asn1.ASN1OctetString;
import org.bouncycastle.asn1.ASN1Primitive;
import org.bouncycastle.asn1.ASN1Sequence;
import org.bouncycastle.asn1.DEROctetString;
import org.bouncycastle.asn1.DERPrintableString;
import org.bouncycastle.asn1.DERSequence;

public class ASN1Handshake1 extends ASN1Object {

private DERPrintableString a, b, idPass;

private ASN1OctetString idK;

// removed TTPs parameter (it wasn't using it)
public ASN1Handshake1(String a, String b, String idK, String idPass) {
this.a = new DERPrintableString(a);
this.b = new DERPrintableString(b);
this.idK = new DEROctetString(idK.getBytes());
this.idPass = new DERPrintableString(idPass);
}

// returns a DERSequence containing all the fields
@Override
public ASN1Primitive toASN1Primitive() {
ASN1Encodable[] v = new ASN1Encodable[] { this.a, this.b, this.idK, this.idPass };
return new DERSequence(v);
}
}

创建握手对象并将其转换为 base64(下面的代码不处理异常,因此相应地添加 try/catch block ):

import org.bouncycastle.util.encoders.Base64;

// create handshake object with some sample data
ASN1Handshake1 handshake = new ASN1Handshake1("a", "b", "ID_K", "ID_PASS");

// convert it to base64
String base64String = new String(Base64.encode(handshake.getEncoded()));
System.out.println(base64String);

这将以base64格式输出握手结构:

MBUTAWETAWIEBElEX0sTB0lEX1BBU1M=

请注意,这不是完整的 PEM(带有诸如 -----BEGIN CERTIFICATE----- 之类的 header ),因为您的自定义结构不是预定义的标准。因此,您必须继续使用这个 base64 通用字符串。

要检查 base64 字符串是否包含 ASN.1 序列,只需执行以下操作:

// read from base64 String
ASN1Sequence seq = (ASN1Sequence) DERSequence.fromByteArray(Base64.decode(base64String.getBytes()));
int n = seq.size();
for (int i = 0; i < n; i++) {
ASN1Encodable obj = seq.getObjectAt(i);
if (obj instanceof DEROctetString) {
System.out.println(new String(((DEROctetString) obj).getOctets()));
} else {
System.out.println(obj);
}
}

输出为:

a
b
ID_K
ID_PASS

关于java - 导出ASN.1格式,然后用Base64 JAVA编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44501947/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com