AES CTR模式 - 使用Crypto ++加密\解密 - 我做得对吗?

时间:2015-10-28 14:42:26

标签: c++ cryptography aes crypto++

在我的应用程序中,我需要使用加密算法,该算法允许我在加密缓冲区中的请求偏移处解密单个字节,而无需读取周围的块。我选择的是使用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模式下)。由于我需要能够解密随机字节,我需要拥有与缓冲区大小一样多的块,这是正确的吗?我的解决方案有效,但速度非常慢......我做得对吗?或者可能有更有效的方法来做到这一点?

2 个答案:

答案 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++
  • 上提到的
  • CTR模式的IV长度为16个字节,但您只使用4个字节。您的代码不仅计算错误,而且还表现出未定义的行为。
  • IV是每条消息,而不是每个字节。
  • 因为你选择了IV错误,你的算法基本上减少到一次性填充,除了不安全。如果您使用相同的密钥加密两条消息,则系统会中断。

性能问题是您最不关心的问题。整个实现只是不正确和不安全。 您必须在尝试使用加密之前系统地学习加密,因为它不是一个只能通过反复试验才能学到的字段。很容易设计一个通过所有单元测试的系统,看起来很适合你自己的眼睛,但完全不受训练的。

我建议cryptography on coursera

相关问题