我正在尝试解密与我们的服务器通信的数据。它是使用某种方案加密的某个 8 位数字。我有加密和完整性密钥。我有一份关于如何解密它的文档,上面写着 -
该值使用自定义加密方案进行加密。加密方案使用带密钥的 HMAC-SHA1 算法根据唯一事件 ID 生成密钥。加密值具有 28 字节的固定长度。它由 16 字节的初始化向量、8 字节的密文和 4 字节的完整性签名组成。根据 RFC 3548,加密值是 web 安全的 base-64 编码,省略了填充字符。因此,28 字节的加密值被编码为 38 个字符的 Web 安全 base-64 字符串。该值被加密为:
值异或 HMAC-SHA1(加密密钥,初始化向量)>
所以解密计算:
HMAC-SHA1(加密密钥,初始化向量)
和 xor 与加密的值来反转加密。完整性阶段需要 4 个字节
HMAC-SHA1(integrity_key, value||initialization_vector)>
在哪里 || 是串联。
所以我写了下面的 PHP 代码。
$value= "[VALUE]"; //38 character base64
$ekey=hextostr("[ENCRYPTIONKEY]"); //64 byte hex encoded key . 32 byte key
$ikey=hextostr("[INTEGRITYKEY]"); //64 byte hex encoded key . 32 byte key
$value=str_replace("-","+",$value);
$value=str_replace("_","/",$value);
$value=$value."==";
$dvalue=base64_decode($value); //Gets a 28 byte encrypted string.
$initvec=substr($dvalue,0,16);
$ciphertext=substr($dvalue,16,8);
$integritysig=substr($dvalue,24,4);
$pad=hash_hmac("sha1",$initvec,$ekey); //Generates 40 byte pad
$uncipher=$ciphertext^$pad;
print($uncipher); //This is 8 byte binary. Dumps some binary on screen. Result should be a 8 byte number
无法绕过这个问题。请指教。