AES(对称加密)和RSA(非对称加密)使用详情

这篇具有很好参考价值的文章主要介绍了AES(对称加密)和RSA(非对称加密)使用详情。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.AES(对称加密)

1.1.AES加密填充方式

      待加密的明文以16字节分组进行加密,如果数据字节长度不是16的倍数,最后的一组则需要在有效数据后面进行填充,使得数据长度变为16字节,AES填充方式分为NoPadding、PKCS5(PKCS7)、ISO10126、Zeros。

NoPadding:不填充,那就只能加密长度为16倍数的数据,一般不使用;

Zeros:补0,如果原数据长度恰好是16的倍数,也要补16个0;

ISO10126:最后一个字节是填充的字节数(包括最后一字节),其他全部填随机数

1 2 3 4 5 6 7 8 9 10 – x x x x x 6

填充6个字节

PKCS5(PKCS7):应用比较多,最后一组缺几个字节就填充几

1 2 3 4 5 6 7 8 9 10 – 6 6 6 6 6 6

前面10个字节,缺6字节才能为一组,填充6个6;如果恰好是16个字节,则填充16个16.

二.RSA(非对称加密)

        首先生成两个密钥,一个公钥,一个私钥,前者加密,后者解密,客户端和服务器各执一份.一般为了安全,私钥是不会给前端暴露出来 的,只会通过私钥生成一个公开的公钥提供给外部对数据进行加密。将加密后的数据传给后端,后端使用私钥解密.当客户端向服务器发送数据的时候,先用公钥加密,再有私钥加签,到了服务器一端,用公钥验签,用私钥解密,然后再往下走.加密是为了安全,加签是为了防止冒充APP 客户端进行请求,导致服务器的瘫痪.

三.前后端常用的加密方式

       3.1.对称加密:指加密和解密使用相同密钥的加密算法,速度较快(包括DES算法,3DES算法,RC5算法,AES算法等);

       3.2.非对称对称加密:指加密和解密使用不同密钥的加密算法,速度较慢(包括RSA等);

       3.3.哈希算法:简单来说就是一种将数据通过算法变成不可逆的数据(包括:MD5、HMAC等);

      3.4.数字签名:是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法

四.AES和RSA结合使用流程:

        客户端签名

        4.1.通讯时,客户端先将数据进行签名,签名可参照微信支付将请求参数按照参数名ASCII码从小到大排序(字典升序进行排列),使用URL键值对的格式(即key1=value1&key2=value2…)进行拼接成字符串。然后用MD5进行加密得到sign1。最后将签名sign1放在请求头中(温馨提示:请求参数中可加入时间戳和随机字符串,可防止重放攻击);

        客户端加密

        4.2.服务器先生成一对RSA的公钥和私钥,然后私钥留在服务器,公钥返回给我们客户端;

        4.3.其次客户端随机生成一个字符串作为AES加密的key1(16位)==>(用AES加密算法来加密与服务器传输的主要内容);

       4.4.最后 客户端 使用从服务器获取的RSA 公钥 将自己本地随机生成的AES的key1进行加密,将加密后的数据放入到请求头中传递给服务器;

      4.5.客户端将请求参数转换为json字符串后,使用本地随机生成的AES加密的key1进行AES加密,然后将加密后的字符串放在请求体中传递给服务器;

       服务器解密

      4.6.服务器 端先用RSA的 私钥 将AES的key1进行解密(因为AES是使用RSA的公钥加密过的,所以需要使用对应的私钥进行解密),然后使用这个key1来解密传输的主要内容;

      服务器签名比对(确认数据是否被篡改过)

     4.7. 然后服务器运用客户端使用的签名方法将主要内容进行签名得到sign,然后跟sign1进行对比。如果相同即数据没有被篡改

     4.8.第6步确认无误后,服务器将要返回给客户端的数据进行签名得到sign2

      服务器加密

     4.9.然后服务器随机生成一个字符串作为AES加密的key2,用AES加密算法来加密需要返回的数据内容;

     4.10.其次 服务器 再使用RSA的 私钥 将AES的key2进行加密,与AES加密后的内容和sign2一同返回给客户端; 

     客户端解密

     4.11.客户端 收到服务器返回的数据后先用RSA的 公钥 将AES的key2进行解密,然后使用这个key2来解密返回的主要内容; 

     4.12.最后将主要内容进行签名得到sign,与sign2进行对比。如果一致则表示数据无误。可进行后续操作

五.代码实例:

 

+ (NSURLSessionTask *)requestPostEncryptionWithURL:(NSString *)URL parameters:(NSDictionary *)parameter networkRequestGraceTimeType:(NetworkRequestGraceTimeType)type  success:(PPRequestSuccess)success failure:(PPRequestFailure)failure
{
   
     ZHHud * hud = [DFHTTPRequest hud:type];

    AFHTTPSessionManager * manager = [DFHTTPRequest sharedZHNetWorking].manager;
    
    /**
     签名
     
     */
    //获取当前的时间戳
    NSString*timeStamp=[NSString df_getNowTimeTimestamp];
    
    //字典按照升序进行排列
    NSString*sign=[self accordingSortDic:parameter];
    //将拼接起来的字符串后面追加时间戳
    NSString*signComponentTimeStamp=[sign stringByAppendingFormat:@"_timestamp%@",timeStamp];
    //字符串的首段和尾部追加appkey
    NSString*lastStr=[NSString stringWithFormat:@"%@%@%@",encryption_Appkey,signComponentTimeStamp,encryption_Appkey];
    //字符串使用MD5进行加密
    NSString*MD5Str=[NSString md532BitLower:lastStr];
    
    /**
     加密
     
     */
    //1.先随机生成一个16位的AES key
    NSString*AES_Key=[self ret32bitString];
    //从服务器获取RSA的公钥==>使用RSA的公钥对AES的公钥进行加密并放在请求头中传递给服务器
    NSString*RSA_Public_Key=[[NSUserDefaults standardUserDefaults]objectForKey:@"publicKey"];
    //2.使用RSA进行加密(放入到请求头里面)

    NSString*RSA_Str=[RSAEncryptor encryptString:AES_Key publicKey:RSA_Public_Key];//加密后的AES公钥
    //使用RSA公钥加密后的AES Key
    [manager.requestSerializer  setValue:RSA_Str forHTTPHeaderField:@"_secret"];
    
    //当前时间戳
     [manager.requestSerializer  setValue:timeStamp forHTTPHeaderField:@"_timestamp"];
    //签名
     [manager.requestSerializer  setValue:MD5Str forHTTPHeaderField:@"_sign"];
  
     
     
     NSString*token=[DFSaveDataClass df_getLocalData:@"token"];
    
     NSString*newToken=[NSString stringWithFormat:@"bearer %@",token];
    
     [manager.requestSerializer setValue:newToken forHTTPHeaderField:@"Authorization"];
    
    //请求体使用AES加密后传给给服务器
    
     NSString*jsonStr=[NSString df_dicConversionWithJsonStringData:parameter];//将请求体转化为json字符串
    
     NSString*dicEncryption=[AESCrypt AES128Encrypt:jsonStr key:AES_Key];
    
    [manager.requestSerializer  setValue:[NSURL URLWithString:URL].host forHTTPHeaderField:@"host"];

    return [manager POST:URL parameters:dicEncryption progress:^(NSProgress * _Nonnull uploadProgress) {
        
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject)  {
        
        [hud hideAnimated:YES];
  
        if (responseObject)
        {
            //获取返回后的字符串
            NSString *result = [[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding];
            
            if ([task.response isKindOfClass:[NSHTTPURLResponse class]])
            {
                NSHTTPURLResponse *r = (NSHTTPURLResponse *)task.response;
                //取出所有的请求头
                NSDictionary*dict=[r allHeaderFields];
                //取出使用RSA加密后的AES 的key
                NSString*secretStr=dict[@"_secret"];

                NSDictionary*lastDic=nil;
    
                    //对加密后的AES key进行解密
                    NSString*decryptionStr=[RSA decryptString:secretStr publicKey:RSA_Public_Key];
                    //将返回的结果使用解密后的AES Key进行解密
                    NSString*responseStr=[AESCrypt AES128Decrypt:result key:decryptionStr];
                    //将JSON字符串转化为字典
                    lastDic=[NSDictionary df_JsonStringConversionWithDic:responseStr];
                
                
            }

            
        }
        
        
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {


            failure(error);
       
       

       
    }];
}

//获取当前时间戳
+(NSString*)df_getNowTimeTimestamp
{
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init] ;

       [formatter setDateStyle:NSDateFormatterMediumStyle];

       [formatter setTimeStyle:NSDateFormatterShortStyle];

       [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss SSS"]; // ----------设置你想要的格式,hh与HH的区别:分别表示12小时制,24小时制

       //设置时区,这个对于时间的处理有时很重要

       NSTimeZone* timeZone = [NSTimeZone timeZoneWithName:@"Asia/Shanghai"];

       [formatter setTimeZone:timeZone];

       NSDate *datenow = [NSDate date];//现在时间,你可以输出来看下是什么格式

       NSString *timeSp = [NSString stringWithFormat:@"%ld", (long)[datenow timeIntervalSince1970]*1000];

       return timeSp;
}

//字典按照升序进行排列
+(NSString*)accordingSortDic:(NSDictionary*)dic
{
    
    /**
     
     将字典按照升序进行排列(具体分为下面五个步骤)
     */
    
      //1.取出所有的key
    NSArray *keyArray = [dic allKeys];
      //2.将key按照升序进行排列
    NSArray *sortArray = [keyArray sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        return [obj1 compare:obj2 options:NSNumericSearch];
    }];
      //3.根据排序好的key,取出对应的value值
    NSMutableArray *valueArray = [NSMutableArray array];
    
    
    NSMutableArray*sortKeyArray=[NSMutableArray array];

    for (NSString*sortString in sortArray)
    {
        id value=[dic objectForKey:sortString];
        
         if ([value isKindOfClass:[NSString class]]||[value isKindOfClass:[NSNumber class]])
         {
             NSString*valueStr=[NSString stringWithFormat:@"%@",value];
             //[[NSString stringWithFormat:@"%@",value] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
             
             if (valueStr.length>0)
             {
                 [sortKeyArray addObject:sortString];
                 [valueArray addObject:valueStr];
             }

         }
        
    }
    //4.现在我们有两个数组,分别对应升序排序的key和value,所以再创建一个keyValue的数组来存储每一个key和value的格式。
    NSMutableArray *signArray = [NSMutableArray array];
    for (int i = 0; i < sortKeyArray.count; i++) {
        NSString *keyValueStr = [NSString stringWithFormat:@"%@%@",sortKeyArray[i],valueArray[i]];
        [signArray addObject:keyValueStr];
    }
    //5.将字符串进行拼接起来
    NSString *sign =[signArray componentsJoinedByString:@""];

    return sign;
    
}

//随机生成一个32位字符串
+(NSString*)ret32bitString

{

    char data[32];

    for (int x=0; x <16; data[x++] = (char)('A' + (arc4random_uniform(26))));

    return [[NSString alloc] initWithBytes:data length:16 encoding:NSUTF8StringEncoding];

}

     文章来源地址https://www.toymoban.com/news/detail-474776.html

到了这里,关于AES(对称加密)和RSA(非对称加密)使用详情的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【crypto++使用】使用crypto++库函数运行RSA非对称加密

    1.(全网最详细攻略)【Crypto++】在Visual studio2022中运行Cryptopp crypto++是一个开源密码学函数库,里面含有很多加密函数的库供大家引用,在官网中也能看到许多代码示范样例。 本文将记录如何使用开发环境:visual studio,引用crypto++的库编写RSA加密的代码。 RSA的安全性依赖于大

    2024年02月11日
    浏览(34)
  • Python(30):非对称加密算法RSA的使用(openssl生成RSA公私钥对)

    1.1、生成RSA公私钥对命令 1.2、公钥 -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCfNHu9aoeNUTAZH3GCP2CQaSOg XNx0tImsIaCWBEQK3/fvUx8f17hIOtttCMrrTPWefUdcUxLIZ+xzqeU/eISsz9Ym kguImd1+bMkGIYiHBKmF5Uww2jGSU738c+AUuRKpixZP+VPekLY+KbOH7NkE2U/L XGbDeMXeiqQ22UmOSQIDAQAB -----END PUBLIC KEY----- 1.3、私钥 -----BEGIN RSA PRIVATE KEY--

    2024年02月03日
    浏览(40)
  • Java RSA加解密-非对称加密-公钥私钥加解密(使用hutool工具)

    之前一篇帖子(https://blog.csdn.net/u014137486/article/details/136413532)展示了使用原生Java进行RSA加解密,本文介绍下使用当下流行的Hutool工具进行RSA加解密的用法。 目录 一、在Linux环境下生成公钥、私钥文件 二、将生成的公私钥文件导入项目中并移除pem文件的前后公私钥标记 三、po

    2024年04月23日
    浏览(90)
  • php对称加密AES加密解密

    AES-128-ECB和AES-256-CBC是两种常见的AES加密模式,它们在加密方式和安全性上有以下区别: 加密方式: AES-128-ECB:ECB(Electronic Codebook)模式是最简单的AES加密模式,它将数据分成固定大小的块,每个块独立加密。这意味着相同的明文块将始终加密为相同的密文块,因此ECB模式不

    2024年02月09日
    浏览(61)
  • AES 对称加密算法

    高级加密标准(英语:Advanced Encryption Standard,缩写:AES),是一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。 那么为什么原来的DES会被取代呢,,原因就在于其使用56位密钥,比较容易被破解。而AES可以使用128、192、和256位密钥,并且

    2023年04月17日
    浏览(39)
  • RSA+AES 混合加密

    非对称加密,使用公钥和私钥加密和解密,加密速度慢,公私钥分离安全性较高 具有以下特点: 安全性较高:RSA算法采用非对称加密方式,使用不同的公钥和私钥进行加密和解密,公钥用于加密,私钥用于解密,这种机制保证了加密数据的安全性。 适用性广泛:RSA算法广泛

    2024年02月04日
    浏览(38)
  • 加密算法 AES和RSA

    通过互联网发送数据,数据可能会被第三者恶意窃听,造成损失。因此需要给重要的数据进行加密,加密后的数据被称为“密文”。接收方通过解除加密或得原本的数据,把密文恢复为原本数据的操作叫做“解密”。像这样就减少了数据被恶意窃听的风险。 那么加密是怎么操

    2024年02月06日
    浏览(55)
  • RSA+AES实现混合加密

    为什么使用RSA + AES混合加密 1.加密介绍 RSA加密: 属于非对称加密,公钥用于对数据进行加密,私钥对数据进行解密,两者不可逆。公钥和私钥是同时生成的,且一一对应。比如:客户端拥有公钥,服务端拥有公钥和私钥。客户端将数据通过公钥进行加密后,发送密文给服务端

    2024年02月05日
    浏览(47)
  • Python 基于pycryptodome,实现对AES、DES、3DES、RSA等常用加密算法的使用,文末附各种加密的源码示例

    (中文名:加密圆顶)pycryptodome是一个基于c实现的Python库,它在2.x中支持2.7以上版本,或3.x中支持3.5以上版本的Python。 可以使用以下命令安装它: 该库支持以下特性 认证加密模式 Authenticated encryption modes (GCM, CCM, EAX, SIV, OCB) AES加密在英特尔上的加速 Accelerated AES on Intel platf

    2023年04月09日
    浏览(89)
  • 非对称加密-RSA

    1.对称加密 对称密码的核心是一把密钥, 使用相同的密钥进行加密和解密。 如移位密码、 S-DES 但密匙本身也是信息,对称密码中它的安全得不到保障。 2.非对称加密 非对称密码的核心是公钥和私钥。 公钥是用于加密数据的密钥,而私钥则用于解密数据 发送方使用接收方的

    2024年02月19日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包