博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#/IOS/Android通用加密解密方法
阅读量:4696 次
发布时间:2019-06-09

本文共 6911 字,大约阅读时间需要 23 分钟。

原文:

公司在做移动端ios/android,服务器提供接口使用的.net,用到加密解密这一块,也在网上找了一些方法,有些是.net加密了android解密不了,或者反之。下面的是三个平台都可以加密解密的方法。加密解密中用到的key="1234578";在调取方法时传值即可。

C#代码

     #region   跨平台加解密(c#)                ///         /// 对字符串进行DES加密        ///         /// 待加密的字符串        /// 
加密后的BASE64编码的字符串
public string Encrypt(string sourceString, string sKey) { 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; } } } /// /// 解密 /// /// 要解密的以Base64 /// 密钥,且必须为8位 ///
已解密的字符串
public string Decrypt(string pToDecrypt, string sKey) { //转义特殊字符 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; } } #endregion

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,//  加密根据哪标准(des3desaes)                       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];}

Android代码

//加密        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));        }

   最后还要注意一下,一般在客户端调用接口时,请求的是URL地址,参数需要加密,比如token,如果token里含有+号,URL会转码为空格,这时在.net端接收到token时,需要把token中的空格替换为+号:token = Regex.Replace(token, @"\s", "+");这样接收到的token才能正常的解密。

posted on
2015-06-25 14:58 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/lonelyxmas/p/4599993.html

你可能感兴趣的文章
批处理文件中的路径问题
查看>>
hibernate出现No row with the given identifier exists问题
查看>>
为什么wait()和notify()属于Object类
查看>>
配置NRPE的通讯
查看>>
匹配两个空格之间的字符。。。
查看>>
CSS 文字溢出 变成省略号 ...
查看>>
Spring事务
查看>>
java编程基础(三)流程控制语句
查看>>
让数据库跑的更快的7个MySQL优化建议
查看>>
jquery 取id模糊查询
查看>>
解决在vue中,自用mask模态框出来后,下层的元素依旧可以滑动的问题
查看>>
修改node节点名称
查看>>
PAT(B) 1014 福尔摩斯的约会(Java)
查看>>
PAT甲级题解-1123. Is It a Complete AVL Tree (30)-AVL树+满二叉树
查看>>
项目开发总结报告(GB8567——88)
查看>>
SSH加固
查看>>
端口扫描base
查看>>
iOS IM开发的一些开源、框架和教程等资料
查看>>
FansUnion:共同写博客计划终究还是“流产”了
查看>>
python 二维字典
查看>>