我正在寻找一种非常快速的方法来加密和解密短文本片段。在我的用例中,安全性是次要的。使用常数IV的轻量加密很好。我现在正在这样做:
BS = 16
pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)
unpad = lambda s : s[:-ord(s[len(s)-1:])]
import base64
from Crypto.Cipher import AES
iv = '0123456789012345'
def encrypt(raw, key):
raw = pad(raw)
cipher = AES.new(key, AES.MODE_CBC, iv)
return base64.b64encode( cipher.encrypt( raw ) )
def decrypt(enc, key):
enc = base64.b64decode(enc)
cipher = AES.new(key, AES.MODE_CBC, iv)
return unpad(cipher.decrypt( enc ))
enc_text = encrypt('Hello World!','xyz1234567890abc')
print decrypt(enc_text, 'xyz1234567890abc')
如何让它更快?也许通过使用另一种AES模式(MODE_CBC?),或者是否有更快的填充功能,更快的十六进制转换输出方式?
答案 0 :(得分:0)
计数器模式(var compare = function(whatToCompare, data) {
var results = {}
for (var i = 0; i < data.length; i++) {
if (!results[data[i][whatToCompare]]) {
results[data[i][whatToCompare]] = []
}
results[data[i][whatToCompare]].push(data[i])
}
for (var entry in results) {
if (results[entry].length < 2){
delete results[entry]
} else {
var buyer = false
var seller = false
for (var j = 0; j < results[entry].length; j++){
if (results[entry][j]["type"] === "Seller"){
seller = true
}
if (results[entry][j]["type"] === "Buyer"){
buyer = true
}
}
if (buyer === false || seller === false){
delete results[entry]
}
}
}
return results
}
)对于多块消息来说会更快,因为它可以并行化以进行加密和解密。 AES.MODE_CTR
是加密串行的,因为每个块密码操作的结果输出在加密之前作为输入馈送到下一个块的明文CBC
。因为XOR
通过使用密钥加密每个(顺序)计数器值来生成密钥流,所以它不依赖于任何先前块操作的输出并且可以并行执行任务。
此外,由于CTR
作为流密码运行,因此不需要填充消息,因此您可以节省进出该操作的时间。
注意:不要重复使用计数器。你提到保密是这里的第二个问题,但是在CBC模式下重新使用IV是“坏”,在CTR模式下重新使用计数器是世界末日坏。 Just使用sequential counter (literally i++
) combined with 64 bits of the ms since epoch start
,你会没事的。 (有关原因的详细示例,请参阅Stream Reuse或Many Time Pad Attack。