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

本文介绍了一种使用DES算法进行数据加密和解密的方法。包括前后端如何约定加密密钥和初始矢量,以及C#后端和iOS前端的具体实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

欢迎留言,如有不妥请多多指教;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值