如何使用ASN1和SHA256将数字签名从C#转换为Java
昨天,我决定做数字签名,然后我找到了c#示例代码。我试图把它转换成java,但由于我有限的知识,它还没有完成 这是C代码 我把那些C#代码弄糊涂了 SignerUtilitiesInit和BlockUpdate到底是什么? 我可以使用什么类用ASN1Object替换SignerUtilities 谢谢所有读过这篇文章的人如何使用ASN1和SHA256将数字签名从C#转换为Java,java,c#,bouncycastle,Java,C#,Bouncycastle,昨天,我决定做数字签名,然后我找到了c#示例代码。我试图把它转换成java,但由于我有限的知识,它还没有完成 这是C代码 我把那些C#代码弄糊涂了 SignerUtilitiesInit和BlockUpdate到底是什么? 我可以使用什么类用ASN1Object替换SignerUtilities 谢谢所有读过这篇文章的人 public string Sign(string payload, string privateKey) { List<string> segments = ne
public string Sign(string payload, string privateKey)
{
List<string> segments = new List<string>();
var header = new { alg = "RS256" };
DateTime issued = DateTime.Now;
DateTime expire = DateTime.Now.AddHours(10);
byte[] headerBytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(header, Formatting.None));
byte[] payloadBytes = Encoding.UTF8.GetBytes(payload);
segments.Add(Base64UrlEncode(headerBytes));
segments.Add(Base64UrlEncode(payloadBytes));
string stringToSign = string.Join(".", segments.ToArray());
byte[] bytesToSign = Encoding.UTF8.GetBytes(stringToSign);
byte[] keyBytes = Convert.FromBase64String(privateKey);
var privKeyObj = Asn1Object.FromByteArray(keyBytes);
var privStruct = RsaPrivateKeyStructure.GetInstance((Asn1Sequence)privKeyObj);
ISigner sig = SignerUtilities.GetSigner("SHA256withRSA");
sig.Init(true, new RsaKeyParameters(true, privStruct.Modulus, privStruct.PrivateExponent));
sig.BlockUpdate(bytesToSign, 0, bytesToSign.Length);
byte[] signature = sig.GenerateSignature();
//segments.Add(Base64UrlEncode(signature));
return Base64UrlEncode(signature);
}
private static string Base64UrlEncode(byte[] input)
{
var output = Convert.ToBase64String(input);
output = output.Split('=')[0]; // Remove any trailing '='s
output = output.Replace('+', '-'); // 62nd char of encoding
output = output.Replace('/', '_'); // 63rd char of encoding
return output;
}
private static String sign(String payload, String privateKey) throws Exception{
String header = "{\"alg\":\"RS256\"}";
Date issued = new Date();
Date expire = new Date( issued.getTime() + 10 * 60 * 60 * 1000 );
byte[] headerBytes = header.getBytes(StandardCharsets.UTF_8);
byte[] payloadBytes = payload.getBytes(StandardCharsets.UTF_8);
String stringToSign = Base64UrlEncode(headerBytes) + "." + Base64UrlEncode(payloadBytes);
byte[] byteToSign = stringToSign.getBytes(StandardCharsets.UTF_8);
byte[] keyBytes = Base64.getDecoder().decode(privateKey.getBytes(StandardCharsets.UTF_8));
PemReader reader = new PemReader(new StringReader(privateKey));
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(reader.readPemObject().getContent());
KeyFactory kf = KeyFactory.getInstance("RSA");
Signature privateSignature = Signature.getInstance("SHA256withRSA");
privateSignature.initSign(kf.generatePrivate(spec));
privateSignature.update(byteToSign);
byte[] signature = privateSignature.sign();
return Base64UrlEncode(signature);
}
private static String Base64UrlEncode(byte[] input){
String output = java.util.Base64.getEncoder().encodeToString(input);
output = output.split("=")[0];
output.replace('+','-');
output.replace('/','_');
return output;
}
var privKeyObj = Asn1Object.FromByteArray(keyBytes);
var privStruct = RsaPrivateKeyStructure.GetInstance((Asn1Sequence)privKeyObj);
ISigner sig = SignerUtilities.GetSigner("SHA256withRSA");
sig.Init(true, new RsaKeyParameters(true, privStruct.Modulus, privStruct.PrivateExponent));
sig.BlockUpdate(bytesToSign, 0, bytesToSign.Length);
byte[] signature = sig.GenerateSignature();
//segments.Add(Base64UrlEncode(signature));
return Base64UrlEncode(signature);