連載第一回ではTLSのハンドシェイク処理について解説したので、今回はアプリケーションデータ転送部分について少し見ていくことにします。
ご存じの通りTLSのデータ転送部分は、ネットワークプロトコルとしてはTCPの上にTLSレコードを乗せて送受信します。TLSレコードは共通鍵暗号で暗号化されたアプリケーションデータとデータの一貫性を保証するためのMAC値からできています。AES-CBCのような従来型の共通鍵暗号方式を使う場合は、主に共通鍵暗号化処理とMAC値を求めるためのハッシュ処理が行われます。これに対して、認証タグ付き暗号、いわゆるAEAD暗号ではMAC値は使わず、ブロックごとの暗号化処理とともに認証タグ値を計算します。いずれの場合でも処理時間はおおむね転送するデータのサイズに比例するので、画像ストリームのように大きなデータ、多量のデータを転送する場合には使用する暗号スイートについて考慮する必要があります。
上のグラフはTLSレコードの転送スピードの相対値を暗号スイートごとに比較したものです。それぞれのスイートごとの送信、受信スピード(毎秒のバイト数)とともに、比較のために暗号化、復号化処理単体のスピードを追加しています。
TLSの送受信処理時間の要素は、大きくはアプリケーションデータの暗号/復号化処理とTCPレイヤーのパケット送受信時間の二つです。
送信時には、TCPの送信データはバッファリングされるので、レコードの送信スピードは実際のネットワークのデータの転送速度よりずっと高速に実行できます。それに対してデータ暗号化処理は相応に処理時間を必要とします。グラフからわかるように、結果としてそのスピードは暗号化処理のスピードに近い値となります(AES-CBCの場合は、AES暗号化とともにハッシュ処理時間をあわせた処理スピード)。
一方受信の場合は、ネットワークを転送されるデータを待たなければ復号化処理はできません。復号化処理はネットワークデータを待っている間に処理されるので、TLSレコードの転送速度の値としてはTCPレイヤーの転送速度の方が見えてきます。
また、アルゴリズムによってスピードは大きく違ってきます。セキュリティ、安全性の観点からは現在広く使われているAES-CBCよりAEADによる暗号化が求められます。特にTLS1.3ではAEADのみが認められています。AEADの中でも、Chacha-Polyは大幅なスピードの向上が期待できます。また、同じAESでもGCMよりCCMの方がかなりの改善が期待できるので、アルゴリズムの選択が可能な場合は考慮するとよいでしょう。
一方で、最近のMCUではハードウェア暗号アクセラレータを搭載しているものも多く、そうした機能を利用すればソフトウェアだけで実現する場合にくらべて多くの場合、一桁程度性能が改善します。
以上、今回はTLSレコードの転送スピードについて紹介しました。wolfSSLには簡単なベンチマークプログラムも含まれていて、お客様の実際の環境で測定することができるようになっていますので、ぜひ実機にてお試しください。wolfSSLのベンチマークについて詳しくはinfo@wolfssl.jp にお問い合わせください。