サーバーに通信しているデータを復号化しようとしています。スキームを使用して暗号化されたその特定の8桁の番号。暗号化キーと整合性キーを持っています。私はそれを解読する方法についてのドキュメントを持っています-
値は、カスタム暗号化スキームを使用して暗号化されます。暗号化スキームは、キー付きHMAC-SHA1アルゴリズムを使用して、一意のイベントIDに基づいてシークレットパッドを生成します。暗号化された値の長さは28バイトに固定されています。これは、16バイトの初期化ベクトル、8バイトの暗号文、および4バイトの整合性署名で構成されています。暗号化された値は、RFC 3548に従って、Webセーフのbase-64エンコードであり、パディング文字は省略されています。したがって、28バイトの暗号化された値は、38文字のWebセーフBase64文字列としてエンコードされます。値は次のように暗号化されます。
値xorHMAC-SHA1(encryption_key、initialization_vector)>
したがって、復号化は次のように計算します。
HMAC-SHA1(encryption_key、initialization_vector)
暗号化を逆にするために暗号化された値を持つ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
この問題を回避できません。ご意見をお聞かせください。