如何使用ASN1和SHA256将数字签名从C#转换为Java

如何使用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

昨天,我决定做数字签名,然后我找到了c#示例代码。我试图把它转换成java,但由于我有限的知识,它还没有完成

这是C代码

我把那些C#代码弄糊涂了

SignerUtilitiesInit和BlockUpdate到底是什么? 我可以使用什么类用ASN1Object替换SignerUtilities

谢谢所有读过这篇文章的人

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