| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 | 
							- using System;
 
- using System.IO;
 
- using System.Security.Cryptography;
 
- using System.Text;
 
- using UnityEngine;
 
- namespace TapTap.AntiAddiction.Internal
 
- {
 
-     public static class Tool
 
-     {
 
-         public static int GetMonthDayCount(int year, int month)
 
-         {
 
-             switch (month)
 
-             {
 
-                 case 1:
 
-                 case 3:
 
-                 case 5:
 
-                 case 7:
 
-                 case 8:
 
-                 case 10:
 
-                 case 12:
 
-                     return 31;
 
-                 case 2:
 
-                     return IsLeapYear(year) ? 29 : 28;
 
-                 default:
 
-                     return 30;
 
-             }
 
-         }
 
-         public static bool IsLeapYear(int year)
 
-         {
 
-             return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
 
-         }
 
-         public static string EncryptString(string str)
 
-         {
 
-             MD5 md5 = MD5.Create();
 
-             // 将字符串转换成字节数组
 
-             byte[] byteOld = Encoding.UTF8.GetBytes(str);
 
-             // 调用加密方法
 
-             byte[] byteNew = md5.ComputeHash(byteOld);
 
-             // 将加密结果转换为字符串
 
-             StringBuilder sb = new StringBuilder();
 
-             foreach (byte b in byteNew)
 
-             {
 
-                 // 将字节转换成16进制表示的字符串,
 
-                 sb.Append(b.ToString("x2"));
 
-             }
 
-             // 返回加密的字符串
 
-             return sb.ToString();
 
-         }
 
-         /// <summary>
 
-         /// Encrypt the content with public key (in string)
 
-         /// </summary>
 
-         /// <param name="input"></param>
 
-         /// <param name="key"></param>
 
-         /// <returns></returns>
 
-         public static string RsaEncrypt(string input, string key)
 
-         {
 
-             //https://stackoverflow.com/questions/11506891/how-to-load-the-rsa-public-key-from-file-in-c-sharp
 
-             try
 
-             {
 
-                 var base64Info = Convert.FromBase64String(key);
 
-                 RSACryptoServiceProvider rsa = DecodeX509PublicKey(base64Info);
 
-                 var encodeInfo = Encoding.UTF8.GetBytes(input);
 
-                 var encryptInfo = rsa.Encrypt(encodeInfo, false);
 
-                 return Convert.ToBase64String(encryptInfo);
 
-             }
 
-             catch (Exception e)
 
-             {
 
-                 Debug.LogErrorFormat($"RSA Encrypt Error! input: {input} key: {key}/n Msg: {e.Message}");
 
-             }
 
-             return null;
 
-         }
 
-         private static bool CompareBytearrays(byte[] a, byte[] b)
 
-         {
 
-             if (a.Length != b.Length)
 
-                 return false;
 
-             int i = 0;
 
-             foreach (byte c in a)
 
-             {
 
-                 if (c != b[i])
 
-                     return false;
 
-                 i++;
 
-             }
 
-             return true;
 
-         }
 
-         private static RSACryptoServiceProvider DecodeX509PublicKey(byte[] x509Key)
 
-         {
 
-             // encoded OID sequence for  PKCS #1 rsaEncryption szOID_RSA_RSA = "1.2.840.113549.1.1.1"
 
-             byte[] seqOid = { 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00 };
 
-             // ---------  Set up stream to read the asn.1 encoded SubjectPublicKeyInfo blob  ------
 
-             MemoryStream mem = new MemoryStream(x509Key);
 
-             BinaryReader binaryReader = new BinaryReader(mem);    //wrap Memory Stream with BinaryReader for easy reading
 
-             try
 
-             {
 
-                 var twoBytes = binaryReader.ReadUInt16();
 
-                 if (twoBytes == 0x8130) //data read as little endian order (actual data order for Sequence is 30 81)
 
-                     binaryReader.ReadByte();    //advance 1 byte
 
-                 else if (twoBytes == 0x8230)
 
-                     binaryReader.ReadInt16();   //advance 2 bytes
 
-                 else
 
-                     return null;
 
-                 var seq = binaryReader.ReadBytes(15);
 
-                 if (!CompareBytearrays(seq, seqOid))    //make sure Sequence for OID is correct
 
-                     return null;
 
-                 twoBytes = binaryReader.ReadUInt16();
 
-                 if (twoBytes == 0x8103) //data read as little endian order (actual data order for Bit String is 03 81)
 
-                     binaryReader.ReadByte();    //advance 1 byte
 
-                 else if (twoBytes == 0x8203)
 
-                     binaryReader.ReadInt16();   //advance 2 bytes
 
-                 else
 
-                     return null;
 
-                 var bt = binaryReader.ReadByte();
 
-                 if (bt != 0x00)     //expect null byte next
 
-                     return null;
 
-                 twoBytes = binaryReader.ReadUInt16();
 
-                 if (twoBytes == 0x8130) //data read as little endian order (actual data order for Sequence is 30 81)
 
-                     binaryReader.ReadByte();    //advance 1 byte
 
-                 else if (twoBytes == 0x8230)
 
-                     binaryReader.ReadInt16();   //advance 2 bytes
 
-                 else
 
-                     return null;
 
-                 twoBytes = binaryReader.ReadUInt16();
 
-                 byte lowByte;
 
-                 byte highByte = 0x00;
 
-                 if (twoBytes == 0x8102) //data read as little endian order (actual data order for Integer is 02 81)
 
-                     lowByte = binaryReader.ReadByte();  // read next bytes which is bytes in modulus
 
-                 else if (twoBytes == 0x8202)
 
-                 {
 
-                     highByte = binaryReader.ReadByte(); //advance 2 bytes
 
-                     lowByte = binaryReader.ReadByte();
 
-                 }
 
-                 else
 
-                     return null;
 
-                 byte[] modInt = { lowByte, highByte, 0x00, 0x00 };   //reverse byte order since asn.1 key uses big endian order
 
-                 int modSize = BitConverter.ToInt32(modInt, 0);
 
-                 byte firstByte = binaryReader.ReadByte();
 
-                 binaryReader.BaseStream.Seek(-1, SeekOrigin.Current);
 
-                 if (firstByte == 0x00)
 
-                 {   //if first byte (highest order) of modulus is zero, don't include it
 
-                     binaryReader.ReadByte();    //skip this null byte
 
-                     modSize -= 1;   //reduce modulus buffer size by 1
 
-                 }
 
-                 byte[] modulus = binaryReader.ReadBytes(modSize);   //read the modulus bytes
 
-                 if (binaryReader.ReadByte() != 0x02)            //expect an Integer for the exponent data
 
-                     return null;
 
-                 int expBytes = binaryReader.ReadByte();        // should only need one byte for actual exponent data (for all useful values)
 
-                 byte[] exponent = binaryReader.ReadBytes(expBytes);
 
-                 // ------- create RSACryptoServiceProvider instance and initialize with public key -----
 
-                 RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
 
-                 RSAParameters rsaKeyInfo = new RSAParameters
 
-                 {
 
-                     Modulus = modulus,
 
-                     Exponent = exponent
 
-                 };
 
-                 rsa.ImportParameters(rsaKeyInfo);
 
-                 return rsa;
 
-             }
 
-             catch (Exception)
 
-             {
 
-                 return null;
 
-             }
 
-             finally { binaryReader.Close(); }
 
-             
 
-         }
 
-     }
 
- }
 
 
  |