心情不好,写些东西打发一下时间;今天给大家分享一下对称加密DES算法,代码的后端是C#写的,移动端是iOS;
想对des加密了解更多的,大家可以百度百科;先介绍一下加密和解密的过程:
1.前后端约定加密钥匙key和初始矢量iv(为8位字符),相应的值前后端一定要保持一致;
2.后端C#通过加密函数对待加密字符串进行加密(本例中是对json字符串进行加密);
3.把第二步生产的密文放到一个key值里并通过请求接口传输给app端;
4.app端拿到数据,取出key值里的密文;
5.app通过des解密函数得到解密后的json字符串,最后把json字符串转化为标准的json数据;
接下来依次附上每一步的代码:
C#端解密函数:
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace TestMySqlForApi.Controllers
{
public class DesEncryption
{
public DesEncryption()
{
}
const string KEY_64 = "12345678"; //钥匙key (DES只能8位长度秘钥,3Des可以用16或者24位的,Aes可以用16、24和32的)
const string IV_64 = "abcdefgh"; //矢量 是8个字符,64位
//加密
public string DESEncrypt( string originalValue)
{
using (DESCryptoServiceProvider sa
= new DESCryptoServiceProvider { Key = Encoding.UTF8.GetBytes(KEY_64), IV =Encoding.UTF8.GetBytes(IV_64)})
{
using (ICryptoTransform ct = sa.CreateEncryptor())
{
byte[] by = Encoding.UTF8.GetBytes(originalValue);
using (var ms = new MemoryStream())
{
using (var cs = new CryptoStream(ms, ct,
CryptoStreamMode.Write))
{
cs.Write(by, 0, by.Length);
cs.FlushFinalBlock();
}
return Convert.ToBase64String(ms.ToArray());
}
}
}
}
//解密
public string DESDecrypt(string encryptedValue)
{
using (DESCryptoServiceProvider sa =
new DESCryptoServiceProvider
{ Key = Encoding.UTF8.GetBytes(KEY_64), IV = Encoding.UTF8.GetBytes(IV_64) })
{
using (ICryptoTransform ct = sa.CreateDecryptor())
{
byte[] byt = Convert.FromBase64String(encryptedValue);
using (var ms = new MemoryStream())
{
using (var cs = new CryptoStream(ms, ct, CryptoStreamMode.Write))
{
cs.Write(byt, 0, byt.Length);
cs.FlushFinalBlock();
}
return Encoding.UTF8.GetString(ms.ToArray());
}
}
}
}
}
}
C#调用加密函数:
//对返回的数据进行加密:
string daJSON = "{\"code\":200,\"massage\":\"json数据\"}";
DesEncryption des = new DesEncryption();
daJSON = des.DESEncrypt(daJSON);
daJSON = "{\"key\":\""+daJSON+"\"}";
app端对请求到的数据进行解密,并转化为json格式的数据:
//
// WHDesOperation.m
// DesEncryption
//
// Created by weihong xuan on 2017/12/14.
// Copyright © 2017年 weihong xuan. All rights reserved.
//
#import "WHDesOperation.h"
@implementation WHDesOperation
static const char* encryptWithKeyAndType(const char *text,CCOperation encryptOperation,char *key, char *ivStr)
{
NSString *textString=[[NSString alloc]initWithCString:text encoding:NSUTF8StringEncoding];
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
const void *vkey = key;//密钥
const void *iv = (const void *) ivStr; //矢量
//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进行des对称加密
*
* @param content 要加密的字符串
* @param aKey 加密的key
* @param iv 初始矢量
*
* @return 解密后的字符串
*/
+ (NSString*)encryptWithContent:(NSString*)content key:(NSString*)aKey iv:(NSString*)iv
{
const char * contentChar =[content UTF8String];
char * keyChar =(char*)[aKey UTF8String];
char * ivChar =(char*)[iv UTF8String];
const char *miChar;
miChar = encryptWithKeyAndType(contentChar, 0, keyChar,ivChar);
return [NSString stringWithCString:miChar encoding:NSUTF8StringEncoding];
}
/**
* 解密字符串
*
* @param content 密文字符串
* @param aKey 加密的key
* @param iv 初始矢量
*
* @return 解密后的字符串
*/
+ (NSString*)decryptWithContent:(NSString*)content key:(NSString*)aKey iv:(NSString*)iv
{
const char * contentChar =[content UTF8String];
char * keyChar =(char*)[aKey UTF8String];
char * ivChar =(char*)[iv UTF8String];
const char *miChar;
miChar = encryptWithKeyAndType(contentChar, 1, keyChar,ivChar);
return [NSString stringWithCString:miChar encoding:NSUTF8StringEncoding];
}
/**
* 返回json数据
*
* @param jsonString 解密后的json字符串
* @return 解密后的Json数据
*/
+ (NSDictionary *)convertjsonStringToDict:(NSString *)jsonString{
NSDictionary *retDict = nil;
if ([jsonString isKindOfClass:[NSString class]]) {
NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
retDict = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:NULL];
return retDict;
}else{
return retDict;
}
}
@end
最后附上源代码链接:C#源码:https://gitee.com/C_Dotnet/TestMySqlForApi.git iOS源码:https://gitee.com/xuanTestApp/DotNetForApi.git
欢迎留言,如有不妥请多多指教;