首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在python中使用pycryptodome实现AES OFB

我正在尝试使用pycryptodome库实现AES加密的OFB模式,并且我在理解应该为密码提供什么输入时遇到了问题。我知道pycryptodome已经实现了OFB,但我需要将纯文本拆分为字节,应用OFB的适当步骤来加密它与ECB模式的AES密码,然后解密它。

在python中,像b'\x16\xa8W\xed.)\xc4\xb8x\xd6\xcf\x7f\xf3\xe3;^'这样的字节字符串是如何工作的?

我需要获取这样一个字节字符串,对其进行加密,然后将其一分为二,并将其与纯文本的8个字节进行XOR运算。对我来说,理解并做到这一点最简单的方法是用AES对IV (上面的字节字符串)进行加密,然后将它和纯文本转换为二进制和xor,然后将它们转换回字节字符串。我该怎么做呢?

代码语言:javascript
运行
AI代码解释
复制
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes

plainText = b"Lorem ipsum dolor sit amet, consectetur adipiscing e"
key = b"ANAAREMEREAAAAAA"
iv = get_random_bytes(32)

print("iv: ", iv)

cipher = AES.new(key, AES.MODE_ECB)
toXor = cipher.encrypt(iv)

print("toXor: ", toXor)

"""
toXorF=first half of toXor
ivS=second half of iv

cipherText=toXorF xored to first 8 bytes of plainText
iv=ivS + toXorS
"""

打印输出:

代码语言:javascript
运行
AI代码解释
复制
iv:  b"v'xg;\xd7h\xfc\xf2\xa4[\r\xee]J\x1eu\xa5\xe68\xa3a\xde\x02(\xc1\xe0\xc9z\x0f\xc3n"
toXor:  b'\x97\xbex\xfc\xb6\xbb\x85\xccZ\xc4\xe4\x9d\xd6M\xf2\xd7\xb7\xbf\xd0\xbe\xa5A\xd6\xee\x07U\xe0S\x7f\x88\xea\xcd'

如果您对我的程序/解决我的问题的方法有更好的架构有任何建议,请随时启发我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-09 13:22:58

我应用了t.m.adam的建议,这是最终的代码,它工作得很好。

代码语言:javascript
运行
AI代码解释
复制
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes

plainText = b"Lorem ipsum dolor sit amet, consectetur adipiscing e"
key = b"ANAAREMEREAAAAAA"


def ofbEnc(plainText, key):
    pos = 0
    cipherTextChunks = []
    iv = get_random_bytes(16)
    originalIV = iv
    cipher = AES.new(key, AES.MODE_ECB)
    if len(plainText) % 16 != 0:
        plainText += b"1"
    while len(plainText) % 16 != 0:
        plainText += b"0"
    while pos + 16 <= len(plainText):
        toXor = cipher.encrypt(iv)
        nextPos = pos + 16
        toEnc = plainText[pos:nextPos]
        cipherText = bytes([toXor[i] ^ toEnc[i] for i in range(16)])
        cipherTextChunks.append(cipherText)
        pos += 16
        iv = toXor
    return (originalIV, cipherTextChunks)


def ofbDec(cipherTextChunks, key, iv):
    plainText = b""
    cipher = AES.new(key, AES.MODE_ECB)
    for chunk in cipherTextChunks:
        toXor = cipher.encrypt(iv)
        plainText += bytes([toXor[i] ^ chunk[i] for i in range(15)])
        iv = toXor
    while plainText[-1] == 48:
        plainText = plainText[0:-1]
    if plainText[-1] == 49:
        plainText = plainText[0:-1]
    return plainText


iv, result = ofbEnc(plainText, key)
print(iv, result)

plain = ofbDec(result, key, iv)
print(plain)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54107888

复制
相关文章
python pyserial 串行端口编程
二、特性 在支持的平台上有统一的接口。 通过python属性访问串口设置。 支持不同的字节大小、停止位、校验位和流控设置。 可以有或者没有接收超时。 类似文件的API,例如read和write,也支持readline等。 支持二进制传输,没有null消除,没有cr-lf转换。
用户5760343
2022/05/13
1K0
ABB GJV3074376R1 可以在设备中读取
为了在控制层实现更大的灵活性,同时减少大量专有通信协议,该公司使用pnGate PA(过程自动化)第一步,将现有的PROFIBUS DP(分散外围)网络迁移到PROFINET。目的是获得初步经验,实现更高的传输速度,并获得一组简化的参数化选项,例如状态监控。
用户10384942
2023/04/28
3730
ABB GJV3074376R1 可以在设备中读取
在Android设备使用Postern实现按规则切换网络
Postern是一款强大的Android网络工具,除了全局网络功能外,它还提供了网络分流的功能,可以按照规则切换网络,实现灵活的网络访问控制。本文将详细介绍如何在Postern中配置网络分流规则,帮助我们实现按规则切换网络,提升网络访问的灵活性和自由度。
华科云商小彭
2023/09/06
4940
在Android设备使用Postern实现按规则切换网络
定制 Fiddler 之按设备过滤请求
在开发/测试过程中有多台设备(PC/手机/模拟器)通过 Fiddler 代理上网时,如何方便地从满屏纷飞的 Session 中筛选出自己关心的那台设备的请求?
零式的天空
2022/03/28
7720
定制 Fiddler 之按设备过滤请求
在开发/测试过程中有多台设备(PC/手机/模拟器)通过 Fiddler 代理上网时,如何方便地从满屏纷飞的 Session 中筛选出自己关心的那台设备的请求?
mzlogin
2020/04/16
1K0
java中按值传递和引用传递区别
一种是按值传递:值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。简单来说就是直接复制了一份数据过去,因为是直接复制,所以这种方式在传递时如果数据量非常大的话,运行效率自然就变低了,所以java在传递数据量很小的数据是值传递,比如java中的各种基本类型:int,float,double,boolean等类型的,具体可以自己测试。 代码:
用户7886150
2021/02/26
8960
USB 设备的PID-Product ID,VID-Vendor ID
根据USB规范的规定,所有的USB设备都有供应商ID(VID)和产品识别码(PID),主机通过不同的VID和PID来区别不同的设备,VID和PID都是两个字节长,其中,供应商ID(VID)由供应商向USB执行论坛申请,每个供应商的 VID是唯一的,PID由供应商自行决定,理论上来说,不同的产品、相同产品的不同型号、相同型号的不同设计的产品最好采用不同的PID,以便区别相同厂家的不同设备。 VID和PID通常情况下有两种存储方式,第一种是主控生产商的VID和PID,存储在主控的bootcode中;第二种是设备
张善友
2018/01/22
2.7K0
USB 设备的PID-Product ID,VID-Vendor ID
移动设备(手机)的唯一ID详解
平台支持:Android - 2.2+ (支持): 与设备的imei号一致。注意:如果无法获取设备imei则使用设备wifi的mac地址,如果无法获取设备mac地址则随机生成设备标识号,确保不同App在同一台设备上获取的值一致。iOS - 4.5+ (支持): 根据包名随机生成的设备标识号。注意:在设备重置后会重新生成。
php007
2019/08/05
5.2K0
移动设备(手机)的唯一ID详解
Linux下获取设备pci ID的方法
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuzhina/article/details/43969499
血狼debugeeker
2018/09/20
7K0
Linux下获取设备pci ID的方法
检查Linux DRM显示设备ID的脚本
不同设计里,Linux DRM子系统里设备ID不一样。每次修改,费时费力,也容易出错。 因此写了以下脚本,自动查找encoder_id,crtc_id,connector_id等。然后在后续命令和脚本中,可以直接引用。 每次使用的时候,需要根据情况,更改display_device。display_device一般是类似a0070000.v_mix的格式,可以通过“dmesg | grep v_mix”查到。
hankfu
2021/09/26
2.6K0
WPF 测试触摸设备发送触摸按下和抬起不成对
我最近拿到一个显示器,这个设备在触摸的时候总是丢笔,我通过本文的程序测试这个设备是否触摸的按下和抬起不成对
林德熙
2021/02/04
3530
Go中没有按引用传递
在Go中两个变量共享同一块内存区域是不可能的。但是两个变量指向的实际存储位置是可以一样的,但这不同于两个变量共享相同的存储区域。
轻吻晴雯
2018/09/27
6180
Go中没有按引用传递
可折叠设备、平板设备和大屏设备更新一览
作者 / Oscar Wahltinez, Developer Relations Engineer, Google
Android 开发者
2022/03/09
2.1K0
可折叠设备、平板设备和大屏设备更新一览
EasyNVR支持的设备接入类型以及关于国标设备是否支持接入EasyNVR
正是由于EasyNVR有越来越多的受众,我们也接受到越来越多的关于EasyNVR的问题,我的设备到底支不支持接入EasyNVR,EasyNVR适合什么样的设备的接入、是否受品牌的限制。。。 本篇博文将详细介绍关于EasyNVR接入设备的问题。
EasyNVR
2020/04/23
8450
EasyNVR支持的设备接入类型以及关于国标设备是否支持接入EasyNVR
小程序可以打破平台限制在硬件设备上运行吗?
在小程序技术日益成熟、生态日益善的前景下,运营者们发现小程序“即用即走、轻量开发”的特点非常契合各种硬件设备的使用场景;开发者们对“一次开发,多端运行”的诉求也变得越来越强烈。
用户10245619
2023/01/11
7660
Java中只有按值传递,没有按引用传递!
今天,我在一本面试书上看到了关于java的一个参数传递的问题: 写道 java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? 我毫无疑问的回答:“引用传递!”,并且还觉得自己对java的这一特性很是熟悉! 结果发现,我错了! 答案是: 值传递!Java中只有按值传递,没有按引用传递! 回家后我就迫不及待地查询了这个问题,觉得自己对java这么基础的问题都搞错实在太丢人! 综合网上的描述,我大概了解了是怎么回事,现在整理如下,如有不对之处望大神提出! 先来看一个作为程序员都熟悉的值传递的例子:
java达人
2018/01/31
1.1K0
Java中只有按值传递,没有按引用传递!
点击加载更多

相似问题

如何获取所有PCI设备的供应商ID和设备ID?

13

设备路径中的供应商id和产品id

12

在PySerial中回传所有串行写入的RS-232设备

11

使用pyserial读取多个串行设备时的大延迟

11

pySerial等待"#“字符从USB串行设备打印输出。

23
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文