iOS开发DES对称加密和解密(C#后端,iOS前端)

释放双眼,带上耳机,听听看~!

心情不好,写些东西打发一下时间;今天给大家分享一下对称加密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

 

人已赞赏
iOS文章

iOS 让正在滑动的scrollView停止滚动(不是禁止,而是暂时停止滚动)

2020-2-7 23:09:20

iOS文章

iOS开发MD5加密的说明使用

2020-2-8 0:31:35

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索