gpt4 book ai didi

Java:将 DKIM 私钥从 RSA 转换为 JavaMail 的 DER

转载 作者:行者123 更新时间:2023-12-01 22:58:30 27 4
gpt4 key购买 nike

我正在使用DKIM for JavaMail使用 DKIM 签署外发邮件。
我的 DKIM 私钥是使用 opendkim-genkey -s default -d example.com 生成的,如下所示:

-----BEGIN RSA PRIVATE KEY-----
ABCCXQ...[long string]...SdQaZw9
-----END RSA PRIVATE KEY-----

JavaMail 库的 DKIM 需要 DER 格式的私有(private) DKIM key ,如其自述文件中所述:

DKIM for JavaMail needs the private key in DER format, you can transform a PEM key with openssl:

openssl pkcs8 -topk8 -nocrypt -in private.key.pem -out private.key.der -outform der

我正在寻找一种方法来避免使用 openssl 将我的 key 转换为 DER 格式。相反,我想直接在 Java 中进行转换。
我尝试过不同的建议(1 , 2 , 3 )但到目前为止还没有任何效果。
DKIM for Java 处理 DER 文件如下:

    File privKeyFile = new File(privkeyFilename);

// read private key DER file
DataInputStream dis = new DataInputStream(new FileInputStream(privKeyFile));
byte[] privKeyBytes = new byte[(int) privKeyFile.length()];
dis.read(privKeyBytes);
dis.close();

KeyFactory keyFactory = KeyFactory.getInstance("RSA");

// decode private key
PKCS8EncodedKeySpec privSpec = new PKCS8EncodedKeySpec(privKeyBytes);
RSAPrivateKey privKey = (RSAPrivateKey) keyFactory.generatePrivate(privSpec);

所以最终我需要的是RSAPrivateKey

如何从我的 RSA 私钥轻松生成 DKIM for JavaMail 所需的 RSAPrivateKey

最佳答案

您的引用文献 3(仅)是正确的;正如它所说,你的问题不仅仅是转换PEM 到 DER(正如 @Jim 所说,基本上只是将 base64 转换为二进制),但转换包含 openssl“传统”或“遗留”或“PKCS#1”格式 key 数据的 PEM包含 PKCS#8(特别是 PKCS#8 明文/未加密)格式 key 数据的 DER。

http://juliusdavies.ca/commons-ssl/pkcs8.html阿利斯泰尔的回答指出看起来有可能,但我没有详细研究。自从 PKCS#8RSA 的clear (PrivateKeyInfo) 只是围绕 PKCS#1 的简单 ASN.1 包装器,以下(有点)快速且(非常)肮脏的代码提供了一个最小的解决方案。更改输入读取逻辑(和错误处理)以尝试并替换可用的 Base64 解码器。

    BufferedReader br = new BufferedReader (new FileReader (oldpem_file));
StringBuilder b64 = null;
String line;
while( (line = br.readLine()) != null )
if( line.equals("-----BEGIN RSA PRIVATE KEY-----") )
b64 = new StringBuilder ();
else if( line.equals("-----END RSA PRIVATE KEY-----" ) )
break;
else if( b64 != null ) b64.append(line);
br.close();
if( b64 == null || line == null )
throw new Exception ("didn't find RSA PRIVATE KEY block in input");

// b64 now contains the base64 "body" of the PEM-PKCS#1 file
byte[] oldder = Base64.decode (b64.toString().toCharArray());

// concatenate the mostly-fixed prefix plus the PKCS#1 data
final byte[] prefix = {0x30,(byte)0x82,0,0, 2,1,0, // SEQUENCE(lenTBD) and version INTEGER
0x30,0x0d, 6,9,0x2a,(byte)0x86,0x48,(byte)0x86,(byte)0xf7,0x0d,1,1,1, 5,0, // AlgID for rsaEncryption,NULL
4,(byte)0x82,0,0 }; // OCTETSTRING(lenTBD)
byte[] newder = new byte [prefix.length + oldder.length];
System.arraycopy (prefix,0, newder,0, prefix.length);
System.arraycopy (oldder,0, newder,prefix.length, oldder.length);
// and patch the (variable) lengths to be correct
int len = oldder.length, loc = prefix.length-2;
newder[loc] = (byte)(len>>8); newder[loc+1] = (byte)len;
len = newder.length-4; loc = 2;
newder[loc] = (byte)(len>>8); newder[loc+1] = (byte)len;

FileOutputStream fo = new FileOutputStream (newder_file);
fo.write (newder); fo.close();
System.out.println ("converted length " + newder.length);

旁白:我认为您发布的数据中的 ABCC 已被编辑。任何有效且合理的PKCS#1(清除)RSA key 必须以字节 0x30 0x82 x 开头,其中 x 为 2 到 9 左右;转换为 base64 时,必须以 MIIC 到 MIIJ 开头。

关于Java:将 DKIM 私钥从 RSA 转换为 JavaMail 的 DER,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23709898/

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