DES非對稱式加密解密跨平台(C#,安卓,ios)

來源:互聯網
上載者:User

標籤:--   sizeof   char*   tao   nslog   oar   throws   res   amp   

 

#region   跨平台加解密(c# 安卓 IOS)        public static string sKey = "123456";        /// <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 static 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:@"%@", jm];       }       //解密       +(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];       }       */

 

親測可用:附帶一份ios源碼

https://files.cnblogs.com/files/xiang-wei/ios_des%E5%8A%A0%E5%AF%86.zip

DES非對稱式加密解密跨平台(C#,安卓,ios)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.