加密解密--换行符作祟

     最近在对于某一个(省略)功能进行联调功能:

大致需求:消息以JSON格式显示--JSON分为消息头(header),消息体(body),消息签名(mac)--通过AESbody内部值进行加密,通过MD5header+body信息进行加密成mac值;

其实思路真的很简单,但是在测试上真的是测试的不少的天数,原因何在呢?

测试缓慢的原因:

  • 1、对于需求细节还欠缺了解-->到底对谁加密?加密前后关系,先对body加密,还是先加密成mac?……
  • 2、对于细节研究不专心-->最后的一根稻草被加密过程中的换行符所压倒;

     本篇主要还是对于加密过程中的过程进行分析:

     在测试的过程中,愈来愈发现自己的赋值已经没有了问题,但是为何加密之后,传回来的响应报文却总是"报文错误(mac解析错粗),到底是哪里出现了问题?

  • 分析一:通过AESTools1.jar工具进行测试,对比自己的代码以及其工具生成是否保持一致;
  • 分析二:仔细查询结果,从发送报文加密前后进行分析;

     首先对于分析一而言:当拿到这个jar的时候,你是否能够快速的响应?到底该如何使用?在这里有两种思考:思考一,我不想进行返回值对比,只想使用其中的某个类,比如:AesEncrypt加密解密类,我该如何处理?首先使用解压工具对其进行解压操作;


     但是其类型并非是.java类型,我们可以采用反编译工具比如:JD-GUI 来进行反编译操作。最后可以很方便的看到自己想要的代码类,我们直接选择我们想要的即可。


     除了使用其jar包中的代码为我所用,我们可以直接使用这个工具对其结果进行分析对比操作。

     通过dos窗口,执行操作:java -jar jar包路径


     分析二:对于分析一而言,自己并没有找到什么问题,一切都很顺利,那么到底是哪里的问题?自己对比body,mac加密前后以及自己最后的请求报文自己发现了问题:


     红色标记部分body加密信息为何不一致?自己分析就会发现居然在自己的眼皮之下多了"换行符"!!自己对于body是通过AES加密的,在调试的过程中,其实很容易发现:




     Base64加密到了一定长度会自动换行,就如上图所示,所以必须得想办法去掉换行符。如上图所示直接加密之后对其进行操作可以,同样也可以在其根源Base64加密方法上进行replaceAll操作,这样避免本模块大量的加密过程多次换行操作。

 

本篇主要还是讲述了两点:

  • 点一:反编译软件的使用;
  • 点二:加密过程中换行符的使用;

行是知之始,知是行之成。——陶行知


转载于:https://www.cnblogs.com/huohuoL/p/10545476.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用python的cryptography库来实现AES加密解密,以及使用zeropadding进行填充。 首先,你需要安装cryptography库。可以使用以下命令来安装: ``` pip install cryptography ``` 接下来,你可以使用以下代码示例来实现AES加密解密,并使用zeropadding进行填充: ```python from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from cryptography.hazmat.primitives import padding from cryptography.hazmat.backends import default_backend import os def aes_encrypt(plain_text, key): # 生成一个随机的初始化向量 iv = os.urandom(16) # 使用zeropadding进行填充 padder = padding.ZeroPadding(128).padder() padded_data = padder.update(plain_text) + padder.finalize() # 创建AES加密器对象 cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend()) encryptor = cipher.encryptor() # 执行加密操作 cipher_text = encryptor.update(padded_data) + encryptor.finalize() return iv + cipher_text def aes_decrypt(cipher_text, key): # 提取初始化向量和密文 iv = cipher_text[:16] cipher_text = cipher_text[16:] # 创建AES解密器对象 cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend()) decryptor = cipher.decryptor() # 执行解密操作 padded_data = decryptor.update(cipher_text) + decryptor.finalize() # 使用zeropadding进行取消填充 unpadder = padding.ZeroPadding(128).unpadder() plain_text = unpadder.update(padded_data) + unpadder.finalize() return plain_text # 测试代码 key = os.urandom(32) # 生成一个随机密钥 plain_text = b"Hello, AES!" # 原始文本 # 加密 cipher_text = aes_encrypt(plain_text, key) print("Cipher Text: ", cipher_text) # 解密 decrypted_text = aes_decrypt(cipher_text, key) print("Decrypted Text: ", decrypted_text) ``` 这段代码中,我们使用了AES加密算法和CBC模式来加密解密数据。同时,我们使用了zeropadding进行填充,确保数据长度满足加密算法的要求。需要注意的是,密钥的长度必须符合AES算法的要求(16、24、或32字节)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值