1首先拿到java方publicKey跟privateKey,然后利用下面方法转换为C#可以识别的key,需要用到BouncyCastle.Crypto.dll。

(1)java私钥转为c#私钥

public static string RSAPrivateKeyJava2DotNet(string privateKey)
        {
            var privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(Convert.From 64String(privateKey));
            string res =
                string.Format(
                   \"<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent><P>{2}</P><Q>{3}</Q><DP>{4}</DP><DQ>{5}</DQ><InverseQ>{6}</InverseQ><D>{7}</D></RSAKeyValue>\",
                    Convert.To 64String(privateKeyParam.Modulus.ToByteArrayUnsigned()),
                    Convert.To 64String(privateKeyParam.PublicExponent.ToByteArrayUnsigned()),
                    Convert.To 64String(privateKeyParam.P.ToByteArrayUnsigned()),
                    Convert.To 64String(privateKeyParam.Q.ToByteArrayUnsigned()),
                    Convert.To 64String(privateKeyParam.DP.ToByteArrayUnsigned()),
                    Convert.To 64String(privateKeyParam.DQ.ToByteArrayUnsigned()),
                    Convert.To 64String(privateKeyParam.QInv.ToByteArrayUnsigned()),
                    Convert.To 64String(privateKeyParam.Exponent.ToByteArrayUnsigned()));
            return res;
        }

 

(2)java公钥转为C#公钥

public static string RSAPublicKeyJava2DotNet(string publicKey)
        {
            RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.From 64String(publicKey));
            return string.Format(\"<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent></RSAKeyValue>\",
                 Convert.To 64String(publicKeyParam.Modulus.ToByteArrayUnsigned()),
                 Convert.To 64String(publicKeyParam.Exponent.ToByteArrayUnsigned()));
        }

 

2 将需要验签的数据转换为byte[]类型,用到了下面方法

 public static byte[] toByteArray(string arg)
        {
            if (!string.ReferenceEquals(arg, null))
            {
                char[] NewArray = new char[1000];
                char[] array = arg.ToCharArray();
                int length = 0;
                for (int i = 0; i < array.Length; i++)
                {
                    if (array[i] != \' \')
                    {
                        NewArray[length] = array[i];
                        length++;
                    }
                }
                int EvenLength = (length % 2 == 0) ? length : length + 1;
                if (EvenLength != 0)
                {
                    int[] data = new int[EvenLength];
                    data[EvenLength - 1] = 0;
                    for (int i = 0; i < length; i++)
                    {
                        if (NewArray[i] >= \'0\' && NewArray[i] <= \'9\')
                        {
                            data[i] = NewArray[i] - \'0\';
                        }
                        else if (NewArray[i] >= \'a\' && NewArray[i] <= \'f\')
                        {
                            data[i] = NewArray[i] - \'a\' + 10;
                        }
                        else if (NewArray[i] >= \'A\' && NewArray[i] <= \'F\')
                        {
                            data[i] = NewArray[i] - \'A\' + 10;
                        }
                    }
                    byte[] byteArray = new byte[EvenLength / 2];
                    for (int i = 0; i < EvenLength / 2; i++)
                    {
                        byteArray[i] = (byte)(data[i * 2] * 16 + data[i * 2 + 1]);
                    }
                    return byteArray;
                }
            }
            return new byte[] { };
        }

 

取到byte[]数据以后,再转换为 64

Convert.To 64String(byte[])

 

3利用验签方法进行验签

public static bool VerifyData(string publicKey, string content, string signature,   halg = null)
        {
            byte[] byte_tmp = Encoding.UTF8.GetBytes(content);
            byte[]  64_tmp = Convert.From 64String(signature);
            bool res = Execute(publicKey,algorithm => algorithm.VerifyData(byte_tmp, GetHalg(halg),  64_tmp));
            return res;
        }

 

收藏 打印