RSA加密算法

来源:互联网 发布:爱氏晨曦牛奶 知乎 编辑:程序博客网 时间:2024/06/05 00:40
</pre><pre name="code" class="csharp">大家好!我是小唐,最近刚转过来做游戏了,最近做RSA加密算法这一块,然后我的后台服务器是Java的,我用C#去写,分享给大家。希望对你们有帮助。<span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px;">用到一个开源加密库</span><span style="margin: 0px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px;">Bouncy Castle Crypto APIs,</span><span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px;">官网地址: </span><a target=_blank title="http://www.bouncycastle.org/csharp/" href="http://www.bouncycastle.org/csharp/" target="_blank" style="margin: 0px; padding: 1px 3px; color: green; text-decoration: none; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px;">http://www.bouncycastle.org/csharp/</a>
using UnityEngine;using System.Collections;using System.Security.Cryptography;using System;using System.Text;using System.Xml;using Org.BouncyCastle.Asn1.Pkcs;using Org.BouncyCastle.Asn1.X509;using Org.BouncyCastle.Crypto.Parameters;using Org.BouncyCastle.Math;using Org.BouncyCastle.Pkcs;using Org.BouncyCastle.Security;using Org.BouncyCastle.X509;public class test : MonoBehaviour{    //用户输入的密码    private string password = " moogame123456##,,你好";    //要进行加密的原文密码字符串    public string noEncryptString = string.Empty;    //加密之后的字符串    public string encodeString = string.Empty;    //解密之后的字符串    public string decodeString = string.Empty;    private static string netPublicKey = string.Empty;    private static string netPrivateKey = string.Empty;    // Use this for initialization    void Start()    {        //加密规则(将密码原文和时间戳用英文半角的逗号连接)        noEncryptString = password + "," + GetTimeStamp();        netPublicKey = RSAPublicKeyJava2DotNet(publicKey);        netPrivateKey= RSAPrivateKeyJava2DotNet(privateKey);        UnitTest();    }    private static string publicKey ="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCRxWOV1HDkxZWGDORdQBUjMpEji3JFiMY4nWNPaHWrGGSrzIqgPGGzXMBVD87CWfoXaHiFOQjhW7YenGnQRKCFa8bmnCXE1kEUb23MEtxYynVg5Pr8/ecg10UsWzOyHIboB8a/A6niKZ1m84FfAybJkl1Qpjvm1dg9J/0GVXhz6QIDAQAB";    private static string privateKey = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJHFY5XUcOTFlYYM5F1AFSMykSOLckWIxjidY09odasYZKvMiqA8YbNcwFUPzsJZ+hdoeIU5COFbth6cadBEoIVrxuacJcTWQRRvbcwS3FjKdWDk+vz95yDXRSxbM7IchugHxr8DqeIpnWbzgV8DJsmSXVCmO+bV2D0n/QZVeHPpAgMBAAECgYBLuGgpfUgDXit0jZ/WXKJePTctapM6UXj+EatzpURyUuKAZ2ifIZ5yqDx0Mxjo1gpWPHtWYLEfNx+cOQ2yFOP4fB+Pfk9l80yPNfcnsOCWWZR2qOL8CyWZBrO3xUKZh/+KrTQvsLhIRaXMwqezJx7fW6JXIsJDM7JjhFD5d/3QcQJBAPSFIsQtzJTRHi3ZJ8qH2GBJPRRVkTxbfzAHs3tJTeMT+omanlkvuEHAjmzdoC0RIwHj/vgS0RblUnfv0MK9NpUCQQCYnWXcYjV+EQT0IWMEXuKIfI5RFrlK8bpU0u05Bg0f2cPKFjkRlx2JN3cOnGwp8FVSsz8gwsMOr3vzrKProxcFAkEAsZAosftsL7k3yCWEjr9dMnacwzJr+D+dOdytyl5uD/NHITvFt5A+pojVJFtAYNmr6UiOs8i+S3kWDQB6QaAzjQJAfRvC7hiAW5leIzffcSzLrjHVhToIqhxhsLm9CJsiVTLyow72t6nW567VZd/rd7HycDpLDPM8biSDi23CbyAidQJBALksugl3hFPOu21AVfXTwexzp+hkLGxcmmOm1kxFB6uObWRq4gFLBvEacC6VQYApRj7W9mVrpzkg58ypP383FNk=";    /// <summary>    /// RSA公钥格式转换,java->.net    /// </summary>    /// <param name="publicKey">java生成的公钥</param>    /// <returns></returns>    public static string RSAPublicKeyJava2DotNet(string publicKey)    {        RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(publicKey));        return string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent></RSAKeyValue>",            Convert.ToBase64String(publicKeyParam.Modulus.ToByteArrayUnsigned()),            Convert.ToBase64String(publicKeyParam.Exponent.ToByteArrayUnsigned()));    }    /// <summary>    /// RSA私钥格式转换,java->.net    /// </summary>    /// <param name="privateKey">java生成的RSA私钥</param>    /// <returns></returns>    public static string RSAPrivateKeyJava2DotNet(string privateKey)    {        RsaPrivateCrtKeyParameters privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(privateKey));        return 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.ToBase64String(privateKeyParam.Modulus.ToByteArrayUnsigned()),            Convert.ToBase64String(privateKeyParam.PublicExponent.ToByteArrayUnsigned()),            Convert.ToBase64String(privateKeyParam.P.ToByteArrayUnsigned()),            Convert.ToBase64String(privateKeyParam.Q.ToByteArrayUnsigned()),            Convert.ToBase64String(privateKeyParam.DP.ToByteArrayUnsigned()),            Convert.ToBase64String(privateKeyParam.DQ.ToByteArrayUnsigned()),            Convert.ToBase64String(privateKeyParam.QInv.ToByteArrayUnsigned()),            Convert.ToBase64String(privateKeyParam.Exponent.ToByteArrayUnsigned()));    }    /// <summary>    /// 解密    /// </summary>    /// <param name="base64code">Base64code.</param>    public static string Decrypt(string toDecryptString)    {        const int PROVIDER_RSA_FULL = 1;        const string CONTAINER_NAME = "Tracker";        CspParameters cspParams;        cspParams = new CspParameters(PROVIDER_RSA_FULL);        //密匙容器的名称,保持加密解密一致才能解密成功        cspParams.KeyContainerName = CONTAINER_NAME;        RSACryptoServiceProvider rsa1 = new RSACryptoServiceProvider(cspParams);        rsa1.FromXmlString(netPrivateKey);        //把要解密的字符串转换成byte数组        byte[] encyrptedBytes = Convert.FromBase64String(toDecryptString);        byte[] plain = rsa1.Decrypt(encyrptedBytes, false);        string decryptedString = System.Text.Encoding.UTF8.GetString(plain);        return decryptedString;    }    /// <summary>    /// 加密    /// </summary>    /// <param name="toEncryptString">To encrypt string.</param>    public static string Encrypt(string toEncryptString)    {        const int PROVIDER_RSA_FULL = 1;        const string CONTAINER_NAME = "Tracker";        CspParameters cspParams;        cspParams = new CspParameters(PROVIDER_RSA_FULL);        //密匙容器的名称,保持加密解密一致才能解密成功        cspParams.KeyContainerName = CONTAINER_NAME;        RSACryptoServiceProvider rsa1 = new RSACryptoServiceProvider(cspParams);        rsa1.FromXmlString(netPublicKey);        //将要加密的字符串转换为字节数组        byte[] data2Decrypt = Encoding.UTF8.GetBytes(toEncryptString);            //将加密后的字节数据转换为新的加密字节数组        byte[] plain = rsa1.Encrypt(data2Decrypt, false);        //将加密后的字节数组转换为字符串        string encryptString = Convert.ToBase64String(plain);        return encryptString;    }    private static byte[] RSAEncrypt(byte[] DataToEncrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding)    {        try        {            RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();            //导入RSA密钥信息。这只需要包含公钥信息。            RSA.ImportParameters(RSAKeyInfo);            //加密过的字节数组并指定OAEP填充。OAEP填充只能在微软Windows XP或以后            return RSA.Encrypt(DataToEncrypt, DoOAEPPadding);        }        catch (CryptographicException e)        {            Debug.LogError(e.Message);            return null;        }    }    private static byte[] RSADecrypt(byte[] DataToDecrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding)    {        try        {            RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();            //导入RSA密钥信息。这需要包括私钥信息            RSA.ImportParameters(RSAKeyInfo);            //解密的字节数组,指定了OAEP padding.oaep填充只能在微软Windows XP或以后            return RSA.Decrypt(DataToDecrypt, DoOAEPPadding);        }        catch (CryptographicException e)        {            Debug.LogError(e.Message);            return null;        }    }    /// <summary>    /// 单元测试    /// </summary>    public void UnitTest()    {        //Debug.LogError("加密前:"+password+"Length:"+password.Length);        Debug.LogError("加密前:" + password + "Length:" + password.Length);        encodeString = Encrypt(password);        Debug.LogError("加密后:"+encodeString);        //decodeString = Decrypt(encodeString);        //Debug.LogError("解密后:"+decodeString+"Length:"+decodeString.Length);        decodeString = Decrypt(encodeString);        Debug.LogError("解密后:" + decodeString + "Length:" + decodeString.Length);    }


0 0
原创粉丝点击