DES非对称加密解密跨平台(C#,安卓,ios)

Posted 非同凡向

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DES非对称加密解密跨平台(C#,安卓,ios)相关的知识,希望对你有一定的参考价值。

 

#region   跨平台加解密(c# 安卓 iospublic 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 =@"";
           }
           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)的主要内容,如果未能解决你的问题,请参考以下文章

三重Des对称加密在AndroidIos 和Java 平台的实现

跪求 DES跨(C# Android IOS)三个平台通用的加解密方法

MD5 不可逆加密,Des对称可逆加密 ,RSA非对称可逆加密 ,数字证书 SSL

基于C#的RSA非对称加密算法

加密算法系列之:des加密aes加密3des加密对称加密非对称加密Hash 算法

plsql实现DES对称加密