在我的应用程序中,我需要使用加密算法,该算法允许我在加密缓冲区中的请求偏移处解密单个字节,而无需读取周围的块。我选择的是使用Crypto ++库的带CTR模式的AES。由于我找不到任何好的例子,我自己写了:
function decision(p){
var patient_id = $(p).data('patient_id');
var patient_username = $(p).data('patient_username');
var doctor_id = $(p).data('doctor_id')
var doctor_fname = $(p).data('doctor_fname');
$.ajax({
type:"post",
url:"php/add.php",
data: {"patient_id": patient_id,"patient_username": patient_username,"doctor_id": doctor_id,"doctor_fname": doctor_fname},
success:function(data){
$("#decision").html(data);
}
});
}
正如您所看到的,我遍历输入缓冲区中的所有字节,并分别加密\解密每个字节,因为每个块都必须有唯一的计数器(在CTR模式下)。由于我需要能够解密随机字节,我需要拥有与缓冲区大小一样多的块,这是正确的吗?我的解决方案有效,但速度非常慢......我做得对吗?或者可能有更有效的方法来做到这一点?
答案 0 :(得分:1)
不,你做得不对。您根本不需要迭代解密方法的输入。
您只需为包含要解密的字节的块计算正确的计数器。然后你可以将该计数器用作IV值。现在,您可以加密或解密密文块并检索正确的字节。无需单独解密特定字节。
因此,如果密码的块大小为16,则IV / nonce为F000000000000000F000000000000000h
且字节的偏移量为260,则计数器/ IV需要以260/16 = 16 = 10h提前。然后F000000000000000F000000000000000h
+ 10h = F000000000000000F000000000000010
。然后解密第16个块,并在偏移量3处取第4个字节(260%16 = 4)。
答案 1 :(得分:1)
您的代码存在以下几个主要问题:
AES-GCM
,看起来很像AES-CTR
。这实际上是在documentation of Crypto++。性能问题是您最不关心的问题。整个实现只是不正确和不安全。 您必须在尝试使用加密之前系统地学习加密,因为它不是一个只能通过反复试验才能学到的字段。很容易设计一个通过所有单元测试的系统,看起来很适合你自己的眼睛,但完全不受训练的。