標籤:
#region 跨平台加解密(c# 安卓 IOS) // public static string sKey = "12345678"; // /// <summary> // /// 解密 // /// </summary> // /// <param name="pToDecrypt">要解密的以Base64</param> // /// <param name="sKey">密鑰,且必須為8位</param> // /// <returns>已解密的字串</returns> // public static string DesDecrypt(string pToDecrypt) // { // //轉義特殊字元 // pToDecrypt = pToDecrypt.Replace("-", "+"); // pToDecrypt = pToDecrypt.Replace("_", "/"); // pToDecrypt = pToDecrypt.Replace("~", "="); // byte[] inputByteArray = Convert.FromBase64String(pToDecrypt); // using (DESCryptoServiceProvider des = new DESCryptoServiceProvider()) // { // des.Key = ASCIIEncoding.ASCII.GetBytes(sKey); // des.IV = ASCIIEncoding.ASCII.GetBytes(sKey); // System.IO.MemoryStream ms = new System.IO.MemoryStream(); // using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write)) // { // cs.Write(inputByteArray, 0, inputByteArray.Length); // cs.FlushFinalBlock(); // cs.Close(); // } // string str = Encoding.UTF8.GetString(ms.ToArray()); // ms.Close(); // return str; // } // } // /// <summary> // /// 對字串進行DES加密 // /// </summary> // /// <param name="sourceString">待加密的字串</param> // /// <returns>加密後的BASE64編碼的字串</returns> // public string Encrypt(string sourceString) //{ // byte[] btKey = Encoding.UTF8.GetBytes(sKey); // byte[] btIV = Encoding.UTF8.GetBytes(sKey); // DESCryptoServiceProvider des = new DESCryptoServiceProvider(); // using (MemoryStream ms = new MemoryStream()) // { // byte[] inData = Encoding.UTF8.GetBytes(sourceString); // try // { // using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(btKey, btIV), CryptoStreamMode.Write)) // { // cs.Write(inData, 0, inData.Length); // cs.FlushFinalBlock(); // } // return Convert.ToBase64String(ms.ToArray()); // } // catch // { // throw; // } // } //} #endregion 安卓--------------------------------------------------------------------------- // // 解密 //public static String DecryptDoNet(String message, String key) // throws Exception { // byte[] bytesrc = Base64.decode(message.getBytes(), Base64.DEFAULT); // Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); // DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8")); // SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); // SecretKey secretKey = keyFactory.generateSecret(desKeySpec); // IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8")); // cipher.init(Cipher.DECRYPT_MODE, secretKey, iv); // byte[] retByte = cipher.doFinal(bytesrc); // return new String(retByte); //} //// 加密 //public static String EncryptAsDoNet(String message, String key) // throws Exception { // Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); // DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8")); // SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); // SecretKey secretKey = keyFactory.generateSecret(desKeySpec); // IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8")); // cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv); // byte[] encryptbyte = cipher.doFinal(message.getBytes()); // return new String(Base64.encode(encryptbyte, Base64.DEFAULT)); //} Ios --------------------------------------------------------------------------------------------------------------------\//加密+(NSString *)decryptWithContent:(NSString *)content{ char * keyChar =(char*)[@"加密key" UTF8String]; NSString *jm = [NSString stringWithCString:encryptWithKeyAndType([content UTF8String], kCCEncrypt, keyChar) encoding:NSUTF8StringEncoding]; return [NSString stringWithFormat:@"%@%@%@",qstr,jm,hstr]; }//解密+(NSData *)encryptWithContent:(NSData *)content{ NSString *contentStr = [[NSString alloc] initWithData:content encoding:NSUTF8StringEncoding]; if (contentStr == nil || [contentStr isEqualToString:@""]) { return nil; } contentStr= [contentStr substringWithRange:NSMakeRange(4,contentStr.length-8)]; const char * contentChar =[contentStr UTF8String]; char * keyChar =(char*)[@"加密key" UTF8String]; const char *miChar; miChar = encryptWithKeyAndType(contentChar, kCCDecrypt, keyChar); if (miChar == nil) { miChar = ""; } NSString *zmStr = [NSString stringWithCString:miChar encoding:NSUTF8StringEncoding]; if (zmStr == nil) { zmStr [email protected]""; } return [zmStr dataUsingEncoding:NSUTF8StringEncoding];} static const char* encryptWithKeyAndType(const char *text,CCOperation encryptOperation,char *key){ NSString *textString=[[NSString alloc]initWithCString:text encoding:NSUTF8StringEncoding]; // NSLog(@"[[item.url description] UTF8String=%@",textString); const void *dataIn; size_t dataInLength; if (encryptOperation == kCCDecrypt)//傳遞過來的是decrypt 解碼 { //解碼 base64 NSData *decryptData = [GTMBase64 decodeData:[textString dataUsingEncoding:NSUTF8StringEncoding]];//轉成utf-8並decode dataInLength = [decryptData length]; dataIn = [decryptData bytes]; } else //encrypt { NSData* encryptData = [textString dataUsingEncoding:NSUTF8StringEncoding]; dataInLength = [encryptData length]; dataIn = (const void *)[encryptData bytes]; } CCCryptorStatus ccStatus; uint8_t *dataOut = NULL; //可以理解位type/typedef 的縮寫(有效維護了代碼,比如:一個人用int,一個人用long。最好用typedef來定義) size_t dataOutAvailable = 0; //size_t 是操作符sizeof返回的結果類型 size_t dataOutMoved = 0; dataOutAvailable = (dataInLength + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1); dataOut = malloc( dataOutAvailable * sizeof(uint8_t)); memset((void *)dataOut, 00, dataOutAvailable);//將已開闢記憶體空間buffer的首 1 個位元組的值設為值 0 //NSString *initIv = @"12345678"; const void *vkey = key; const void *iv = (const void *) key; //[initIv UTF8String]; //CCCrypt函數 加密/解密 ccStatus = CCCrypt(encryptOperation,// 加密/解密 kCCAlgorithmDES,// 加密根據哪個標準(des,3des,aes。。。。) kCCOptionPKCS7Padding,// 選項分組密碼演算法(des:對每塊分組加一次密 3DES:對每塊分組加三個不同的密) vkey, //密鑰 加密和解密的密鑰必須一致 kCCKeySizeDES,// DES 密鑰的大小(kCCKeySizeDES=8) iv, // 可選的初始向量 dataIn, // 資料的儲存單元 dataInLength,// 資料的大小 (void *)dataOut,// 用於返回資料 dataOutAvailable, &dataOutMoved); NSString *result = nil; if (encryptOperation == kCCDecrypt)//encryptOperation==1 解碼 { //得到解密出來的data資料,改變為utf-8的字串 result = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)dataOut length:(NSUInteger)dataOutMoved] encoding:NSUTF8StringEncoding]; } else //encryptOperation==0 (加密過程中,把加好密的資料轉成base64的) { //編碼 base64 NSData *data = [NSData dataWithBytes:(const void *)dataOut length:(NSUInteger)dataOutMoved]; result = [GTMBase64 stringByEncodingData:data]; } return [result UTF8String]; } Ios --------------------------------------------------------------------------------------------------------------------\static const char* encryptWithKeyAndType(const char *text,CCOperation encryptOperation,char *key){ NSString *textString=[[NSString alloc]initWithCString:text encoding:NSUTF8StringEncoding]; // NSLog(@"[[item.url description] UTF8String=%@",textString); const void *dataIn; size_t dataInLength; if (encryptOperation == kCCDecrypt)//傳遞過來的是decrypt 解碼 { //解碼 base64 NSData *decryptData = [GTMBase64 decodeData:[textString dataUsingEncoding:NSUTF8StringEncoding]];//轉成utf-8並decode dataInLength = [decryptData length]; dataIn = [decryptData bytes]; } else //encrypt { NSData* encryptData = [textString dataUsingEncoding:NSUTF8StringEncoding]; dataInLength = [encryptData length]; dataIn = (const void *)[encryptData bytes]; } CCCryptorStatus ccStatus; uint8_t *dataOut = NULL; //可以理解位type/typedef 的縮寫(有效維護了代碼,比如:一個人用int,一個人用long。最好用typedef來定義) size_t dataOutAvailable = 0; //size_t 是操作符sizeof返回的結果類型 size_t dataOutMoved = 0; dataOutAvailable = (dataInLength + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1); dataOut = malloc( dataOutAvailable * sizeof(uint8_t)); memset((void *)dataOut, 00, dataOutAvailable);//將已開闢記憶體空間buffer的首 1 個位元組的值設為值 0 //NSString *initIv = @"12345678"; const void *vkey = key; const void *iv = (const void *) key; //[initIv UTF8String]; //CCCrypt函數 加密/解密 ccStatus = CCCrypt(encryptOperation,// 加密/解密 kCCAlgorithmDES,// 加密根據哪個標準(des,3des,aes。。。。) kCCOptionPKCS7Padding,// 選項分組密碼演算法(des:對每塊分組加一次密 3DES:對每塊分組加三個不同的密) vkey, //密鑰 加密和解密的密鑰必須一致 kCCKeySizeDES,// DES 密鑰的大小(kCCKeySizeDES=8) iv, // 可選的初始向量 dataIn, // 資料的儲存單元 dataInLength,// 資料的大小 (void *)dataOut,// 用於返回資料 dataOutAvailable, &dataOutMoved); NSString *result = nil; if (encryptOperation == kCCDecrypt)//encryptOperation==1 解碼 { //得到解密出來的data資料,改變為utf-8的字串 result = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)dataOut length:(NSUInteger)dataOutMoved] encoding:NSUTF8StringEncoding]; } else //encryptOperation==0 (加密過程中,把加好密的資料轉成base64的) { //編碼 base64 NSData *data = [NSData dataWithBytes:(const void *)dataOut length:(NSUInteger)dataOutMoved]; result = [GTMBase64 stringByEncodingData:data]; } return [result UTF8String]; }+(NSString*)encryptWithContent:(NSString*)content type:(CCOperation)type key:(NSString*)aKey{ const char * contentChar =[content UTF8String]; char * keyChar =(char*)[aKey UTF8String]; const char *miChar; miChar = encryptWithKeyAndType(contentChar, type, keyChar); return [NSString stringWithCString:miChar encoding:NSUTF8StringEncoding];}
DES跨(C# Android IOS)三個平台通用的加解密方法