【安全篇】.NET,Android,iOS 双向互通DES+Base64加密

因为项目的需求,最近几天一直在看关于加密的问题,将项目中使用到的DES加密整理一下,它可以使用适用于NET,Android,iOS三个平台.

DES加密,DES有两种,一种是DES,对每组分组进行一次加密,另一种是DES的升级版3DES,就是对每组分组进行3此加密,前者最大可使用8位的密匙,后者最大可使用24为密匙。

看代码:

.NET

<pre>
<code class = 'cs hljs'>
//////
/// 密匙
//////
public static string sKey = "12345678";

///
/// 解密
///
/// 要解密的以Base64
/// 密钥,且必须为8位
/// 已解密的字符串
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;
}
}

/// 对字符串进行DES加密
///
/// 待加密的字符串
/// 加密后的BASE64编码的字符串
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;
}
}
}

</code></pre>

Android

<pre><code class= 'hljs'>
// 加密
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));

}
</code></pre>

iOS

<pre>
<code class='Xcode'>

/**

  • DES加密解密(封装参数为NSString)
  • @param content 加解密内容
  • @param type 加/解密
  • @param aKey 密匙
  • @return 加/解密后的内容
    /
    +(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加密解密

  • @param text 需要加/解密的内容

  • @param encryptOperation 加/解密

  • @param key 密匙

  • @return 加/解密后的内容
    /
    static const char
    encryptWithKeyAndType(const char *text,CCOperation encryptOperation,char *key)
    {
    NSString *textString=[[NSString alloc]initWithCString:text encoding:NSUTF8StringEncoding];
    const void *dataIn;//
    size_t dataInLength;
    if (encryptOperation == kCCDecrypt)//传递过来的是decrypt 解码
    {
    //解码 base64 // !!!!!!!!!!!!!!!!!-------->【解密进行了Base64字符串处理】,加密时使用,如要使用,去除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
    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];
    }

</code></pre>

iOS中需要用到的GTMBase64库

如果只需要DES加密的话,将Base64去掉即可

END

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容