Benchmarking SSH connection: What is the fastest cipher algorithm for RPi?

Hi, this is flownspores who is working at TwoGate inc. This article is my first one! And this is the first of my english blog article in my life. If you find any weird grammar mistakes or misspells, feel free to comment below.

Making the fastest SSH connection

I set up my raspberry pi 3's sshd then I just wondered about performance. Raspberry pi 3 has a tiny ARM cpu with no AES acceleration. Recent Intel or AMD's cpus have AES-NI which can accelerate AES encryption and decryption.

Without AES acceleration, which cipher algorithm is the fastest? That's my question.

I also want to test key exchange algorithms and MAC algorithms. Key exchange algorithm is used to establish of ssh connection (and during rekeying). Public-key cryptography is a secure way to communicate, but it is too slow to use every transfer. So that symmetric-key algorithms are used during data transfer. Public-key encryption is only used to encrypt symmetric-key. Key exchange algorithm is the way to exchange symmetric-key in a secure way. I am not a specialist in this domain, so you may read more details about ssh encryption on the Internet.

Testing ssh algorithms

There are several items in SSH configuration that can be changed, and I compared the algorithms for each. Key exchange algorithms (Kex), Algorithms of Message authentication code (MAC), Cipher algorithms.

KexAlgorithm

SSH's KexAlgorithm is a key exchange algorithm. You can see algorithms which can be used in your ssh connection.

$ ssh -Q kex
diffie-hellman-group1-sha1
diffie-hellman-group14-sha1
diffie-hellman-group14-sha256
diffie-hellman-group16-sha512
diffie-hellman-group18-sha512
diffie-hellman-group-exchange-sha1
diffie-hellman-group-exchange-sha256
ecdh-sha2-nistp256
ecdh-sha2-nistp384
ecdh-sha2-nistp521
curve25519-sha256
curve25519-sha256@libssh.org
sntrup4591761x25519-sha512@tinyssh.org

  Diffie-hellman (DH) key exchange is common in the past but newer algorithms like ECDH or curve25519 have appeared.

So the kex algorithm is used only in establishing the connection*1, I just write the code which simply connects the server and executes : then quickly disconnects. : is a command which does nothing.

ssh -v  -o "ControlMaster=no" -o "ControlPath=none" -o "Compression=no" -o "KexAlgorithms=..." host :

As you can see, I wrote some additional options: "ControlMaster/Path=no" and "Compression=no". ControlMaster/ControlPath option is to multiplex ssh connections which holds persistent connections to the server. At this time, this feature bothers my testing so it should be turned off. Compression is also unnecessary feature during test*2.

I've tested each KexAlgorithms per 5 times. Then I calculated the median value of each algorithm. The graph is shown below.

  • Testing environment
    • Client: Mac mini 2018 Core i7-8700B equipped with 10Gb Ethernet
      • macOS Catalina, OpenSSH_8.1p1, LibreSSL 2.7.3
    • Server: Raspberry Pi 3B+ with Heat sink
      • Debian 10 (Raspberry Pi OS)
    • Network: 1GbE
      f:id:flownspores:20200730053131p:plain
      SSH KeyExchange Algorithm Performance Comparison

As you can see from the graph, the fastest key exchange algorithm is ecdh-sha2-nistp256. The slowest is diffie-hellman-group-exchange-sha256. Curve25519-* appears to be doing well. SHA1 is considered to be obsolete, so you may not use diffie-hellman-group14-sha1.

I will use curve25519-sha256 which is a great balance of speed and security.

MACs

MAC stands for message authentication code, which is like a hash function. (This is a very rough explanation. You may read some informative information on the Internet.)

You can get MAC algorithms to type ssh -Q mac that can be used in your ssh command.

$ ssh -Q mac
hmac-sha1
hmac-sha1-96
hmac-sha2-256
hmac-sha2-512
hmac-md5
hmac-md5-96
umac-64@openssh.com
umac-128@openssh.com
hmac-sha1-etm@openssh.com
hmac-sha1-96-etm@openssh.com
hmac-sha2-256-etm@openssh.com
hmac-sha2-512-etm@openssh.com
hmac-md5-etm@openssh.com
hmac-md5-96-etm@openssh.com
umac-64-etm@openssh.com
umac-128-etm@openssh.com

MAC is used only for non-AEAD encryption like aes256-ctr, aes256-cbc. AEAD encryption like aes256-gcm already has an MAC-ish authentication algorithm itself, so I use encryption of aes256-gcm at this time.

Sending large file to Raspberry pi

The test is transferring a 100MiB file by scp. Measuring time of sending client to server (/dev/null). Yes I know that scp is outdated today, but sftp is complex to use from programs. Rsync can't write out to /dev/null. that's why i use scp.

  • Tesing environment
    • hardware configuration is same as before.
    • using aes256-ctr as cipher

f:id:flownspores:20200730060011p:plain
SSH MAC Algorithm Performance Comparison (Client to RPi)

The fastest algorithm is umac-64@openssh.com and umac-128-etm@openssh.com. The slowest is hmac-sha2-512.

ETM means encrypt-then-mac, which is considered stronger than non-ETM (like MAC-then-Encrypt). You should use *-etm over non-ETM.

Note that MAC option is not effective if you use AEAD encryption (like AES-GCM). AES-GCM is preferred over non-GCM for security reasons.

Receiving large file from Raspberry pi

f:id:flownspores:20200730065341p:plain
SSH MAC Algorithm Performance Comparison (RPi to Client)

The fastest is umac-64@openssh.com and umac-64-etm@openssh.com. umac-128-etm@openssh.com and umac-128@openssh.com is also fast enough.

umac-*s are the best choice for both sending and receiving.

Ciphers

Finally I have tested cipher algorithms. RC4 (arcfour) is considered the fastest algorithm on non-AES accelerated CPUs. But RC4 is considered a weak algorithm today. It is not usable algorithms in my OpenSSH:

$ ssh -Q cipher
3des-cbc
aes128-cbc
aes192-cbc
aes256-cbc
rijndael-cbc@lysator.liu.se
aes128-ctr
aes192-ctr
aes256-ctr
aes128-gcm@openssh.com
aes256-gcm@openssh.com
chacha20-poly1305@openssh.com

I use these algorithms for testing at this time.

  • Tesing environment
    • hardware configuration is same as before.
    • for non-AEAD cipher, umac-128-etm@openssh.com as MAC
    • 100MiB transfer, same as before

Can't wait to see the results? Let's see.

Sending large file to Raspberry pi

f:id:flownspores:20200730062432p:plain
SSH Cipher Algorithm Performance Comparison (Client to RPi)
Surprisingly, the newest algorithm chacha20-poly1305@openssh.com is the slowest 😭. The fastest is aes128-ctr. Why? When I transferring large file from Mac mini, mini's AES-NI hardware acceleration is used for encryption. So this test is not informative for raspberry pi's performance index.

Receiving large file from Raspberry pi

So I've also tested reverse transmission. Client to RPi. But the results are not much different.

f:id:flownspores:20200730070551p:plain
SSH Cipher Algorithm Performance Comparison (RPi to Client)

The fastest is aes128-ctr. *-ctrs are the fastest in this test. The transfer rate may be capped by the bandwidth of the Raspberry Pi's SD card.

Despite these results, I would still use *-gcm for security reason.

Conclusion

If you want to harden security with small amount of speed sacrifice:

  • curve25519-sha256 as KexAlgorithms
  • aes*-gcm@openssh.com as Ciphers

If you want the fastest connection (not so bad for security), use:

  • ecdh-sha2-nistp256 as KexAlgorithms
  • umac-*-etm@openssh.com as Macs
  • aes128-ctr as Ciphers

Benchmarking script

I've tested the performance of ssh in various algorithms by this script. This is an automated script that connects host with many different ssh configurations. Then this script writes CSV files. Each test is executed only one time, so you may need to run the test repeatedly to get accurate results. If you run this script for remote server over the Internet, results may not be accurate. So you might be better using it for local network.

*1:Strictly speaking, KeyExchange is also occurs during rekey.

*2:Mac/cipher test shown below is transferring large random data. Generally speaking, random data has high entropy which can't be compressed.

会社としてスタートアップを目指すことをやめました。

本日、2020年7月4日。32歳になりました。
TwoGateのCEO小林です。(社内ではセオと呼ばれています)

 

今月で起業してから9年が終わり、10年目という節目の年になります。

会社ブログとして、みんなで振り返りの記録を残すことになりました。

 

続きを読む

TwoGate主催の高専生限定ハッカソン「TwoGate DevCamp 2020 Spring」を開催しました!

 

5月2~4日の3日間、ハッカソン「TwoGate DevCamp 2020 Spring」を開催しました!

今日はこのハッカソンをレポートしていきます。

 

 

 

TwoGate DevCamp 2020 Springとは?

f:id:TwoGate-tech:20200703134906p:plain

株式会社TwoGateが開催する、”高専生限定”の3日間の集中ハッカソンインターンです。当初は都内で開催する予定でしたが、新型コロナウイルスの影響で、オンラインでの開催となりました。

 

株式会社TwoGateとは?

f:id:TwoGate-tech:20200703135157p:plain

株式会社TwoGateは、社員のほとんどが高専出身のエンジニアで構成されており、高い技術力、開発力、チーム力が売りの会社です。アプリやシステム開発を強みとして、ビジネスを成功させるために、作って終わりにしない、突き抜けるまで作り続けるがモットーの、エンジニアカンパニーです。

 

現在、フルリモートでの学生インターン生も募集しているので、気になった方はこちらからどうぞ!

twogate.com

 

スケジュール

スケジュールは以下のように実施しました。

5/1 0日目

前夜祭

ハッカソン開始の前日、自由参加で前夜祭を開催しました!

内容は、TwoGateの会社概要や技術の説明会を行いました。

 

5/2 1日目

開会式

午前10時、ハッカソンがスタートし、開会式が執り行われました。

開会式では全員の自己紹介や、ハッカソンの詳細説明がありました。

f:id:TwoGate-tech:20200703151024p:plain

開会式が終わるとすぐに、チームでの開発に取り掛かります。

 

5/3 2日目

2日目は丸一日、開発に時間を使います。

各チームが昨日出したアイデアに沿って、開発を行います。

各チームにメンターがついているので、技術的なサポートは完璧です。短期間でのハッカソンなので、わからないことがあれば、すぐにメンターが対応して解決に導きます。

 

5/4 最終日

早くも最終日です。午後2時から最終発表会があり、ここで最優秀賞が決まります。

各チームが開発したサービスは以下の通りです。

 

各チームの開発プロダクト

Aチーム「Daily Game」

コロナの影響で生活リズムが崩壊していて、元のリズムになんとしてでも戻したい人を対象にした、タスクが完了しないと罰ゲームが執行されてしまうサービスです。

ToDoにタスクを設定し、そのタスクが完了すればなんともないのですが、タスクを完了できなかった場合、Twitterの表示名が「自分の言ったことすら守れないカス」に勝手に変更されてしまい、さらにツイートまでされてしまうといった罰が与えられます。

f:id:TwoGate-tech:20200703151117p:plain

 

Bチーム「あつまれ!小説の森」

ユーザーが自由にテーマを投稿でき、そのテーマに沿ってリレー小説を書くことができるサービスです。ユーザーは、「誰が」「どこで」「何をした」というテーマを投稿できます。また、小説を書くときには、他のユーザーが投稿したテーマがランダムで選ばれて、それにそって小説を書くことができます。しかし、その小説は一人で完成するものではなく、リレー形式で、他のユーザーが続きを書くことができます。

f:id:TwoGate-tech:20200703151200p:plain

f:id:TwoGate-tech:20200703151212p:plain

 

Cチーム「WAST」

WASTはWork(ワーク)Advice(アドバイス)Share(共有)Task(タスク)の頭文字を取った言葉です。

自粛生活が続く中で、「宿題でわからないところがあるのに聞けない」「みんなの課題の進捗具合がわからない」といった問題が発生している現状があります。

WASTは、クラスや部活動といった複数人で構成されるチームの中で、タスクや仕事を共有できるサービスです。

他のメンバーの進捗具合がわかる「タイムライン機能」と、提出物等のタスクを把握できる「タスク一覧機能」の二つで構成されています。

f:id:TwoGate-tech:20200703151510p:plain

f:id:TwoGate-tech:20200703151544p:plain

f:id:TwoGate-tech:20200703151558p:plain

 

Dチーム「New Album」

思い出の写真を、相手と共有・編集できるサービスです。

コロナ自粛の影響で、人とのつながりが薄くなってしまう懸念があります。そこで共有の思い出写真を見ることで、「Weトーク」ができるようになります。

f:id:TwoGate-tech:20200703151717p:plain

f:id:TwoGate-tech:20200703151741p:plain

f:id:TwoGate-tech:20200703151757p:plain

f:id:TwoGate-tech:20200703151809p:plain

 

Eチーム「スキトーク

自粛生活が続き、さみしくなってしまっている人や、スキを共有できる人が周りにいない人を対象にした、オンライントークルームを作成したり参加できるサービスです。

ユーザーは、話したいことをテーマにルームを作成したり、興味のあるルームに参加することで、そのテーマについて話すことができます。

f:id:TwoGate-tech:20200703151858p:plain

f:id:TwoGate-tech:20200703151912p:plain

f:id:TwoGate-tech:20200703151926p:plain

最優秀賞は、Bチームの「集まれ!小説の森」でした。最優秀賞には賞品として、全員にiPhone11が贈られました。また参加者全員に参加賞として、希望の技術書を一冊プレゼントしました。

 

優勝チームインタビューは高専マガジンの記事で公開されておりますので、こちらをご確認ください!

どのチームも面白いアイデアで、たった3日の開発で作ったとは思えないものばかりでした。

kosen-magazine.com

 

参加者の声

福島高専 新妻さん

メンターがついてくれていたので、技術面をサポートしていただけてよかったです。最初僕たちのチームのアイデアが良くなかったのですが、メンターの方に指摘していただいたおかげで、いい方向に進んだなと思います。

あと、これまでは個人開発がメインだったこともあり、ランダムでチームを組んで開発するような経験はありませんでした。なので今回は、共同開発のやり方とかを教えてもらうことができて、いい経験になりました。

 

苫小牧高専 水野さん

このハッカソンでは、discordでやり取りをすることになっていました。discordでは、誰がオンライン状態で活動しているのかとかがわかりやすくて、オンラインでも他のチームの動きが少し感じられるようになっているので、よく考えられているなと感じました。

これまでハッカソンに参加したことは無かったのですが、本当に参加してよかったと感じました。

 

宇部高専 村上さん

メンターがすごい。技術的なサポートをしっかりしてくれました。でもさらに、チームメンバーがすごい。どんどん加速して開発していけました。

オンラインでも意外とスムーズに開発できるんだなと感じました。でもやっぱり、オフラインのハッカソンに参加したいですね。(笑)

 

熊本高専 川上さん

メンターが一人ついてるのは珍しいですよね。社員さんも高専卒の人だから、気軽に話せました。実際の開発を想定しながら相談に乗っていただけたので、勉強になりました。

あとオンラインで開催という点においても、ありがたいですね。地元から出ていくとなると移動時間もかなりかかってしまうので。オフラインの方が良い点もあるとは思いますが、こういうオンラインでの開発も良いなと感じました。

 

長野高専出身 村田さん

僕たちのチームは、TwoGateインターン生で構成されているチームなので、ハンデとしてメンターがついていません。そこがきついですね。(笑)

オンラインで開発する経験はインターンで経験しているので、他のチームよりはなれていると思います。ですが、オフラインということもあって、他のチームの様子が見にくいので、ちょっと怖い部分もあります。

 

最後に

時期的な問題もあり、オンラインでの開催となってしまった今回の「TwoGate DevCamp 2020 Spring」ですが、無事に終了することができました。

今後もハッカソンを企画しようと考えておりますので、学生の皆さんはぜひ、参加してみてください!

 

 

高専マガジンさんにも、3日間の様子を中心にしたレポートを公開いただいています。

こちらも併せてご覧ください。

https://kosen-magazine.com/twogate-devcamp-2020-spring-report/ 

 

TwoGateでは、高専生向けの長期インターンを随時募集しています!

エントリーをお待ちしています。

https://twogate.com/

 

執筆協力:高専マガジン