AES暗号化アプレットログの解釈

先行レビュー

wx.getUserInfoで暗号化されたデータ(はEncryptedData)()コールバックでの成功を得
た暗号化データ(はEncryptedData)が復号され、OpenIDのunionIdを得ました。

どのように公式文書が説明されて復号化します!

ここに画像を挿入説明

あなたが解読命令上記参照初めて、私だけはEncryptedDataを知っているとSESSION_KEY方法を取得します。

パートのプレゼンテーションでSESSION_KEY、次のように:
SESSION_KEYとOpenIDの(暗号化と復号化、署名シリーズ)を取得

質問を生じる:
1:AESとは何ですか?
2:128とは何ですか?
3:CBCはそれは何ですか?
4:初期ベクトルIVは何をどうするのですか?
5:それはどういう意味PKCS#7を使用してデータを埋めますか?
6:どのように1,2,3,4アルゴリズム、暗号文、鍵は、組み合わせて使用される初期ベクトルは、IVを説明しますか?
7:それは何BASE64_DECODEですか?


1. AESそれは何ですか?

米国国立標準技術研究所は、2001年のAdvanced Encryption Standard(AES)のAdvanced Encryption Standardをリリースしました。
AES暗号化は、データブロックに基づいて
データが16バイトの倍数でない場合、すなわち、処理データがあるたびに(16バイト)が充填され、
ベースのビットストリーム暗号とは異なるとしてブロック暗号(と呼ばれます)、パケット長は16バイトです。

AES是一个对称分组密码算法。
  • 1

簡単に言えば、非対称暗号化アルゴリズム、対称暗号化アルゴリズムの違いを概説します。

対称暗号化アルゴリズムの
暗号化と復号化の鍵は、通常のデータ伝送機会のために、非常に高速に同じ使用、この暗号化方式の暗号化されています。欠点は、キーを輸送するあまりにも面倒です。

非対称暗号化アルゴリズム
、暗号化と復号鍵が異なるため、この暗号化方式は、難治数学の問題の構成を使用することで、暗号化と復号化は時折、通常、データを送信する場合遅いです。利点は、便利なキートランスポートです。一般的な非対称暗号化アルゴリズムはRSA、ECCとEIGamalです。

実際には、典型的には、AES鍵RSA暗号により、受信側に伝送され、受信側AESキー、次に送信側と受信側の通信AES鍵を解読しました。

AES暗号化機能は、
AES暗号化関数E、C = E(K、P)が設けられ 、 Pはプレーンテキストであり、Kはキーであり、Cは暗号文です。つまり、暗号化関数の入力パラメータとして平文Pと鍵Kであり、暗号化関数Eの出力は、Cを暗号文

AES復号機能は
AES復号関数D、P = D(K、C)に配置され 、 Cは暗号文であり、Kはキーであり、Pはプレーンテキストです。すなわち、鍵Kと復号関数として暗号文Cの入力パラメータ、復号関数出力平文P.

パラメータ

  • 平文P:なし暗号化されたデータによる。

  • キーK:平文を暗号化するために使用されるパスワードは、対称暗号化では、暗号化と復号鍵は同じです。通常、非対称鍵暗号化アルゴリズムにより、受信者と送信者の協議のためのキーではなく、直接伝送ネットワーク上の。そうでない場合は、キーの漏洩、その後、それぞれ直面する他、顔や直接相談にネットワークを介して送信キー。キーは、絶対にそうでない場合は、機密データを盗むために暗号文攻撃を復元することになり、漏れることはありません。

  • 暗号文C:データ暗号化機能処理後
    ここに画像を挿入説明


2. 128とは何ですか?

AESは、ブロック暗号であり、ブロック暗号は、グループに平文のセット、それぞれ同じ長さ、各時間平文の完全な暗号化するまで暗号化されたデータの集合です。AES標準仕様では、唯一のパケット長、すなわち、各パケットは16バイト(バイト当たり8ビット)であり、128ビットです。鍵の長さは128ビット、192ビットまたは256ビットを使用することができます。次の表に示すように、暗号化キーの異なる長さは、異なるラウンドをお勧めします。

AES キーの長さ(32ビットワード) パケット長(32ビットワード) 暗号化ラウンド
AES-128 4 4 10
AES-192 6 4 12
AES-256 8 4 14

小さなマイクロチャネル・プログラムは、AES-128を使用します。


3. CBCそれは何ですか?

AES是基于数据块的加密方式,也就是说,每次处理的数据是一块(16字节),
当数据不是16字节的倍数时填充,这就是所谓的分组密码(区别于基于比特位的流密码),16字节是分组长度。

即,AES把看的见的信息(明文),分成很多相同组(明文块),一般为128位(16字节)。
对每组进行单独加密,然后再把各加密块拼接成一条密文。

分组加密的几种方式

  • ECB:是一种基础的加密方式,密文被分割成分组长度相等的块(不足补齐),然后单独一个个加密,一个个输出组成密文。

  • CBC:是一种循环模式,前一个分组的密文和当前分组的明文异或操作后再加密,这样做的目的是增强破解难度。

  • CFB/OFB实际上是一种反馈模式,目的也是增强破解的难度。

ECB模式(基础加密)
处理方式:
密文快[0…n] = 加密算法(明文块[0…n],密钥)

特点:
1:相同的输入产生相同的输出。
2:不能隐藏明文的模式,可能对明文进行主动攻击;

AES默认的,最简单,但安全性不够,所以微信用了改良版CBC。

ここに画像を挿入説明

CBC模式(小程序采用)
处理方式:
密文快[0] = 加密算法(初始向量IV,明文块0,密钥)

其他密文块[1…n]=加密算法(之前的密文块,明文快,密钥)

这个模式是链式的,后一块需要前一块做基础,第一块需要一个需要初始化向量IV做基础。
相同的输入产生不同的输出。
能看到的数据是“明文+IV”或“明文+前一个密文”的乱码,所以能隐藏明文。

总结:
安全性比第一种好,所以微信小程序用AES-CBC模式,所以需要IV向量。
密文 =AES(明文、密钥、初始向量参数)
明文=AES(密文、密钥、初始向量参数)
  • 1
  • 2
  • 3
  • 4

ここに画像を挿入説明

4. PKCS#7填充是什么

因为AES的算法是把明文分组再处理的,他要求每个分组(16字节)是“满”的,即明文长度必须被16字节整除。

所以明文最后不足的16字节的要先进行数据填充,把不足16字节的最后一组补成16字节。

所以可知:明文先填充,再AES加密。

例如:明文171字节,最后一节为11个字节,需要填充5个字节(16-11)

ここに画像を挿入説明
上边是填充的原理,具体来说,填充方式有很多,PKCS#7是其中一种。
PKCS #7 字符串由一个字节序列组成,每个字节填充该字节序列的长度。

ここに画像を挿入説明
下面的示例演示这些模式的工作原理。

假定块长度为 8,数据长度为 9,则填充用八位字节数等于 7,
数据:
FF FF FF FF FF FF FF FF FF
PKCS7 填充:
FF FF FF FF FF FF FF FF FF 07 07 07 07 07 07 07

5. Base64_Decode

Base64是网络上最常见的用于字节代码的编码方式之一(一个字母就是一字节byte)
采用Base64编码具有不可读性,即所编码的数据不会被人用肉眼所直接看到。
Base64编码非常适合HTTP环境下传递较长的标识信息(传输8Bit字节代码)

其他应用程序中,也常常需要把二进制数据编码为适合放在URL中的形式

其实迅雷的“专用地址”也是用Base64”加密”的,其过程如下:
1、在http://地址的前后分别添加AA和ZZ
2、对新的字符串进行Base64编码
把迅雷地址还原为http地址,只需要用Base64解码,然后去掉头尾的AA和ZZ即可。

迅雷地址Base编码案例,详见此文:
http://www.wxappclub.com/topic/711

微信服务器的操作是:

Base64_Encode(目标密文)=encryptedData(wx.getUserInfo得到的)
Base64_Encode(AES密钥)=session_key
Base64_Encode(初始向量)=iv

所以:

目标密文和密钥aeskey要用Base64解密:

即目标密文=Base64_Decode(encryptedData)
即密钥aeskey=Base64_Decode(session_key)
即初始向量=Base64_Decode(iv)

ここに画像を挿入説明

注意:通过如下官方提供的代码demo可知,iv也进行了Base64的解码。
文档上并未说明
ここに画像を挿入説明

6. 理解官方文档

ここに画像を挿入説明

通过上边的分析,我们知道:
微信小程序用的AES加密算法、AES-128的方案、CBC的分组加密模式(此模式需要IV初始化向量)
AES加密敏感数据之前,先用 PKCS#7 填充“用户敏感数据”最后不足16字节的部分。
AES对密文解密后,需用 PKCS#7 去除填充才能得到真正“用户敏感数据”

知道:
openId,union等敏感数据 = AES-128-CBC(密文,密钥,初始向量iv)

第1条:描述的是加密算法和数据填充方式
第2条:描述的是如何得到密文(目标密文=Base64_Decode(encryptedData))
第3条:描述的是如何得到密钥(密钥aeskey=Base64_Decode(session_key))
第4条:描述的是如何得到初始向量iv

上述涉及的数据:
encryptedData(来自第2条)
通过wx.getUserInfo()的success回调得到的

iv(来自第4条)
通过wx.getUserInfo()的success回调得到的

session_key (来自第3条)
1:通过wx.login()的success回调得到的js_code
2:通过js_code、appid、secret得到session_key

7. 加密解密的全过程

微信服务器:加密
1:对敏感用户信息“目标明文”用psck#7号填充得到“填充文”
2:AES-128-CBC(填充文,密钥,初始向量)=>目标密文
3:Base64_Encode(目标密文)=>encryptedData
4:Base64_Encode(初始向量)=>iv
5:Base64_Encode(密钥)=session_key

バックエンドサーバ:解読
1:暗号文はcrypteddata wx.getUserInfo()により得られた、IV
2:()を得js_codeとHTTPインタフェースは、(前を参照)wx.loginにより得られたSESSION_KEY
3:BASE64_DECODE(はEncryptedData)=>暗号文を標的
4:BASE64_DECODE(SESSION_KEY)=>すなわちキーAESKey
5:BASE64_DECODE(IV)=>初期ベクトル
6:AES-128-CBC(ターゲット暗号文、鍵、初期化ベクトル)=>充填紙
7:PSCK#7 「明示的な目的」に敏感なユーザー情報を取得するために詰め物を取り除くテキストを埋めます

おすすめ

転載: www.cnblogs.com/htybky/p/11609907.html