gpt4 book ai didi

java - 使用 RSA 从 C# 到 Java 的 Base64 编码字符串到公钥

转载 作者:行者123 更新时间:2023-12-04 18:01:47 24 4
gpt4 key购买 nike

我正在将遗留应用程序从 .net 转换为 java。使用公钥加密的传统方法。

string text = "<base64encodedstring here>";
IBuffer buffer = CryptographicBuffer.DecodeFromBase64String(text);
AsymmetricKeyAlgorithmProvider asymmetricKeyAlgorithmProvider = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.get_RsaPkcs1());
CryptographicKey cryptographicKey = asymmetricKeyAlgorithmProvider.ImportPublicKey(buffer, 3);
IBuffer buffer2 = CryptographicBuffer.ConvertStringToBinary(data, 0);
IBuffer buffer3 = CryptographicEngine.Encrypt(cryptographicKey, buffer2, null);
byte[] array;
CryptographicBuffer.CopyToByteArray(buffer3, ref array);
//return CryptographicBuffer.EncodeToBase64String(buffer3);

这是我的 Java 代码,用于将给定的文本 转换为公钥

public static PublicKey getKey(String key) throws Exception{
try{
byte[] byteKey = Base64.getDecoder().decode(key);

X509EncodedKeySpec X509publicKey = new X509EncodedKeySpec(byteKey);
KeyFactory kf = KeyFactory.getInstance("RSA","BC");

return kf.generatePublic(X509publicKey);

}
catch(Exception e){
throw e;
}

}

这是我的主要方法

public static void main(String[] args) {
String text = "base64encodedstring";
try {
Security.addProvider(new BouncyCastleProvider());
decode(text);
PublicKey pubKey=getKey(text);
byte[] input = "plaintext".getBytes();
Cipher cipher = Cipher.getInstance("RSA/None/PKCS1Padding", "BC");
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
byte[] cipherText = cipher.doFinal(input);
System.out.println("cipher: " + new String(cipherText));

} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

但是当我尝试获取公钥时,出现以下异常

java.security.spec.InvalidKeySpecException: encoded key spec not recognised
at org.bouncycastle.jcajce.provider.asymmetric.util.BaseKeyFactorySpi.engineGeneratePublic(Unknown Source)
at org.bouncycastle.jcajce.provider.asymmetric.rsa.KeyFactorySpi.engineGeneratePublic(Unknown Source)
at java.security.KeyFactory.generatePublic(Unknown Source)
at com.test.EncryptionUtil.getKey(EncryptionUtil.java:38)
at com.test.EncryptionUtil.main(EncryptionUtil.java:60)

我做错了什么吗?我是密码学的新手。

通过更多的研究,我发现了它在 C# 中的工作方式,但无法将其转换为 java

 public static CryptographicKey GetCryptographicPublicKeyFromCert(string strCert)

{

int length;

CryptographicKey CryptKey = null;



byte[] bCert = Convert.FromBase64String(strCert);



// Assume Cert contains RSA public key

// Find matching OID in the certificate and return public key

byte[] rsaOID = EncodeOID("1.2.840.113549.1.1.1");

int index = FindX509PubKeyIndex(bCert, rsaOID, out length);



// Found X509PublicKey in certificate so copy it.

if (index > -1)

{

byte[] X509PublicKey = new byte[length];

Array.Copy(bCert, index, X509PublicKey, 0, length);



AsymmetricKeyAlgorithmProvider AlgProvider = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.RsaPkcs1);

CryptKey = AlgProvider.ImportPublicKey(CryptographicBuffer.CreateFromByteArray(X509PublicKey));

}



return CryptKey;

}

EncodeOID 方法的用途是什么以及如何在 Java 中实现它。下面的链接解释了创建 base64 编码的公钥字符串并在 C# 中对其进行解码 http://blogs.msdn.com/b/stcheng/archive/2013/03/12/windows-store-app-how-to-perform-rsa-data-encryption-with-x509-certificate-based-key-in-windows-store-application.aspx

最佳答案

没有直接的方法将 microsoft Capi1PublicKey 读入 java。我首先在 WinRT 中将 Capi1PublicKey 转换为 X509 编码的公钥。然后我在 java 中使用创建的 key 。

关于java - 使用 RSA 从 C# 到 Java 的 Base64 编码字符串到公钥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34209562/

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