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