ホームページ > バックエンド開発 > PHPチュートリアル > Lua と php は AES データ暗号化を通じて通信します

Lua と php は AES データ暗号化を通じて通信します

WBOY
リリース: 2016-06-13 12:03:55
オリジナル
2608 人が閲覧しました

Lua と PHP は AES データ暗号化を通じて通信します

最近、同社の WeChat ミニゲーム「Surround the Nervous Cat」は非常に人気があります。会社が一連の Neurocat ミニゲームを開発することを決定したため、私は引き抜かれました。

その後、cocos-2dx を使用して小さなゲームを開発しました。クライアントは、サーバーとクライアント間の対話のセキュリティを確保するために、API を変更することにしました。インターフェース

送信される JSON データを暗号化および復号化します。一般的な状況は、クライアントが暗号化してサーバー セグメントが復号化するというものです:

lua クライアントは純粋な lua で書かれたライブラリを使用します: aeslua、ダウンロード アドレス: http://luaforge.net/ project/aeslua/

しかし、このライブラリには問題があります。このライブラリを使用した暗号化と復号化には問題ありませんが、PHP との通信に問題があります。 Base64 以降は暗号化されます

文字列は PHP では復号化できません。この問題について、私は多くの情報をチェックし、最終的に外国のマスターからの解決策を見つけました:

http://chainans.blogspot.com/2012/09/working-with- lua-encryption.html (FQ できない学生もいるかもしれないので、以下に原文を掲載します:)

Lua 暗号化の操作

最近、Corona SDK を使用していると、Lua の標準的な暗号化/復号化アルゴリズムが必要になり始めています。そもそも、開発者の数はかなり少ないです。私が取り組んできた Objective-C と比較すると、信頼できるサードパーティのライブラリが少ないということです。幸いなことに、そこから始めるためのコードを備えた AESLua というライブラリを見つけました。クライアントとサーバー間でデータを安全に受け渡すため (サーバー側の php) 実際、私が読んだ限りでは、私の方法はあまり安全ではありませんが、参考までに、以下にリストを示します。途中の問題


編集: iPhone 4 でテスト。 .. 1280 文字の暗号文を入力します。一般的な用途では許容できない速度です。>1) コロナにはないようです。


解決策: LuaBit v0.4 をダウンロードして統合します...適切な場所への API 呼び出しを許可するマッピングを作成する必要があります

2) 次に、Base64 ライブラリを取得する必要があります -- ここから入手してください https://gist.github.com/2563975 -- 最初は URL 経由で渡すことができるように作られていました (代わりに '-' と '_' を使用しました)

3) AESLua の場合、デフォルトでは AES-128 を使用します。 、CBC、ある種のランダムなパディング <- 名前がわかりません。IV = 0。AES-128、CBC、PKCS7 パディングに変更します。変換が適切かどうかをテストするための Web サイトは次のとおりです。ではありません

http://www.unsw.adfa.edu.au/~lpb/src/AEScalc/AEScalc.html

http://www .tools4noobs.com/online_tools/decrypt/

やるべきことは次のとおりです

3.1) pwInKey 関数で、

password = ciphermode.encryptString(pwBytes,password,ciphermode.encryptCBC); の行をコメントアウトします。

3.2) util.padByteString 関数で、

に変更します。 local paddingLength = math.ceil(#data/16)*16 - #data;

local padding = "";

local paddingValue = string.char (paddingLength ) -- PKCS7 パディング

i=1,paddingLength の場合、

padding = パディング を実行します。 .paddingValue;-- PKCS7 パディング

end


return data ..padding;


4) テスト用に Web サーバーをセットアップします。php が必要です。 / mcrypt mod to test.

5) テスト用の php を作成します...コードは次のとおりです

さて、以下のプレーンテキストは "1234567890123456ss@#�" です。



$data = 'dXzNDNxckOrb7uz2ON0AAJp4BXgkYewblTNWBSAQSEw=';

$key128 = 34567890123456';

$iv = ' ';


echo mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key128,base64_decode($data), MCRYPT_MODE_CBC, $iv)



?>



以上です。クライアント マシンへの暗号化は簡単です。 =)


*** これらのライブラリを使用すると、ユーザーは、Lua のパフォーマンスがネイティブ コードからはまだ遠いという事実を認識する必要があります。大量のデータの暗号化にはこのアルゴリズムを使用しないでください。

彼の方法によれば、すべて問題ありません。ただし、説明する必要がある点がいくつかあります: (私自身の調査)

1. CBC モードを使用して暗号化された文字列のキーは 16 ビットでなければなりません。そうしないと、PHP はそれを復号化できません。

2. プレフィックスとして key を追加する必要があります。

3. 上記の記事に unpack 関数が記載されていない場合は、aeslua が記述します。正しく復号化されていません。

util.lua の次の関数は次のように変更されます:

function public.unpadByteString(data)
local PadLength = tonum((string.byte(data, #data) ) );
return string.sub(data,1, #data-padLength) --unpack
end

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート