104 lines
3.4 KiB
C#
104 lines
3.4 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Security.Cryptography;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace PayService
|
|
{
|
|
class Sign
|
|
{
|
|
public static string sign(string srcSignPacket, string privateKey)
|
|
{
|
|
string result = null;
|
|
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
|
|
rsa.FromXmlString(RSAConverter.RSAPrivateKeyJava2DotNet(Const.privateKey));
|
|
byte[] data = Encoding.GetEncoding(Const.charset).GetBytes(srcSignPacket);
|
|
//为证书采用MD5withRSA 签名
|
|
byte[] hashvalue = rsa.SignData(data, "MD5");
|
|
|
|
result = Convert.ToBase64String(hashvalue);
|
|
|
|
return result;
|
|
}
|
|
|
|
private static RSACryptoServiceProvider DecodeRSAPrivateKey(string privateKey)
|
|
{
|
|
var privateKeyBits = System.Convert.FromBase64String(privateKey);
|
|
|
|
var RSA = new RSACryptoServiceProvider();
|
|
var RSAparams = new RSAParameters();
|
|
|
|
using (BinaryReader binr = new BinaryReader(new MemoryStream(privateKeyBits)))
|
|
{
|
|
byte bt = 0;
|
|
ushort twobytes = 0;
|
|
twobytes = binr.ReadUInt16();
|
|
if (twobytes == 0x8130)
|
|
binr.ReadByte();
|
|
else if (twobytes == 0x8230)
|
|
binr.ReadInt16();
|
|
else
|
|
throw new Exception("Unexpected value read binr.ReadUInt16()");
|
|
|
|
twobytes = binr.ReadUInt16();
|
|
if (twobytes != 0x0102)
|
|
throw new Exception("Unexpected version");
|
|
|
|
bt = binr.ReadByte();
|
|
if (bt != 0x00)
|
|
throw new Exception("Unexpected value read binr.ReadByte()");
|
|
|
|
RSAparams.Modulus = binr.ReadBytes(GetIntegerSize(binr));
|
|
RSAparams.Exponent = binr.ReadBytes(GetIntegerSize(binr));
|
|
RSAparams.D = binr.ReadBytes(GetIntegerSize(binr));
|
|
RSAparams.P = binr.ReadBytes(GetIntegerSize(binr));
|
|
RSAparams.Q = binr.ReadBytes(GetIntegerSize(binr));
|
|
RSAparams.DP = binr.ReadBytes(GetIntegerSize(binr));
|
|
RSAparams.DQ = binr.ReadBytes(GetIntegerSize(binr));
|
|
RSAparams.InverseQ = binr.ReadBytes(GetIntegerSize(binr));
|
|
}
|
|
|
|
RSA.ImportParameters(RSAparams);
|
|
return RSA;
|
|
}
|
|
|
|
private static int GetIntegerSize(BinaryReader binr)
|
|
{
|
|
byte bt = 0;
|
|
byte lowbyte = 0x00;
|
|
byte highbyte = 0x00;
|
|
int count = 0;
|
|
bt = binr.ReadByte();
|
|
if (bt != 0x02)
|
|
return 0;
|
|
bt = binr.ReadByte();
|
|
|
|
if (bt == 0x81)
|
|
count = binr.ReadByte();
|
|
else
|
|
if (bt == 0x82)
|
|
{
|
|
highbyte = binr.ReadByte();
|
|
lowbyte = binr.ReadByte();
|
|
byte[] modint = { lowbyte, highbyte, 0x00, 0x00 };
|
|
count = BitConverter.ToInt32(modint, 0);
|
|
}
|
|
else
|
|
{
|
|
count = bt;
|
|
}
|
|
|
|
while (binr.ReadByte() == 0x00)
|
|
{
|
|
count -= 1;
|
|
}
|
|
binr.BaseStream.Seek(-1, SeekOrigin.Current);
|
|
return count;
|
|
}
|
|
|
|
}
|
|
}
|