メインコンテンツに移動

Crypto++

暗号化を行うライブラリ.SSL通信なんかプログラム面倒くさいし,簡単にBlowfishあたりで暗号通信ですわ

Crypto++のインストール

これをダウンロードしてインストールすれば完了. あたらしいのはこの辺の cryptopp8xx から探して

Crypto++の利用法

わしは流体力学者だ.暗号?そんなもん,しらん

で10年済ましてきたが,流石に不味げな感じなので少しづつ学ぶ.ってか,いい加減SSL覚えないと,全く動かなくなるかもだが.今は警告出るだけだけど,あと数年で,一切通信できなくなるかも・・・通信できないソフトウェアには意味はないしなあ

いやま,計算プログラム中で一部OS変更でバグっちまって, 15年前に何考えたのか勉強しないと訂正できないのさwww

知恵1:暗号には暗号化モードがあります

ECBモード 

データを等分割し,各ブロックを暗号化する[平文を\(x\)とした時に, \(f(x)\)を計算する]. 平文に"Love"が繰り返されれば,暗号文に対応する文が繰り返される.ってこた,頻度解析で,比較的容易に逆関数を求められる.逆関数を用いれば平文はすぐに得られる.もちろんドイツ軍のエニグマは,こんな間抜けではなかった.

CBCモード

前のブロックに依存してキーが変化する.なので,同じ文章でも暗号化後には違うデータに見える.

他もあるけど,めんどうっす.弱そうなECBで,いいです.

知恵2:パイプライン

で,暗号によって,その「ブロック」の大きさが異なるったい.で,例えばブロックが16だったとき,入力データは16の倍数でなければならぬ・・・だるいっす.そんなの,やってられないっす.

で,パイプラインを使うわけですね.勝手にブロックサイズ合わせて便利にプログラムしてくれる優れもの.覚えることは

  • 台所には,水道の蛇口があります.
  • 台所には,排水口があります
  • 途中で,野菜を洗ったり,鍋を洗ったりできます
  • 排水は一回5リットルと法令で定まってます.それより多かったり少なかったりの量を排水する奴は死刑

これと同じだそうだよ.

#include <cryptopp/filters>
...
std::string 蛇口, 排水口;
CryptoPP::StringSource(蛇口, ture, new CryptoPP::StringSink(排水口));

これで, 蛇口から出た文字列が,排水口に入るらしい. で,お野菜として「その文字,16進数に変更して〜な」「にゃんやったら,それbase64にしてちょ」だと

CryptoPP::StringSource(蛇口, ture, new CryptoPP::HexEncoder(new CryptoPP::StringSink(排水口)));
CryptoPP::StringSource(蛇口, ture, new CryptoPP::Base64Encoder(new CryptoPP::StringSink(排水口)));

これで, 蛇口から任意量のデータを提供して,5リットル単位の排水が出てきて,16進表記になったりBase64になったりしている.便利やん?

知恵3:暗号化

んだば, 暗号化は, まず帝國暗号装置を作成

std::string key="ないしょの鍵♪";
CryptoPP::ECB_Mode<CryptoPP:Blowfish>::Encryption encoder((unsigned char *)key.c_str(),key.size());
CryptoPP::ECB_Mode<CryptoPP:Blowfish>::Decryption encoder((unsigned char *)key.c_str(),key.size());

ほんで

CryptoPP::StringSource(蛇口, ture, new CryptoPP::StreamTransformationFilter(encoder,new CryptoPP::StringSink(排水口)));

で暗号になるし,

CryptoPP::StringSource(蛇口, ture, new CryptoPP::StreamTransformationFilter(decoder,new CryptoPP::StringSink(排水口)));

で解読になる. 試してみると

KEY[./test.data]LEN=11
PLANE TEXT = Yoda said, Do or do not, There is not try.
CHIPER TEXT(HEX)= 66EF66CE328E4F30B81E41406B4219B2B0A4FFD35D3E48B7D75FC327AF2504BE805CE74245E9DC339E11ABB83C7AF227
CHIPER TEXT(B64)= Zu9mzjKOTzC4HkFAa0IZsrCk/9NdPki311/DJ68lBL6AXOdCRencM54Rq7g8evIn
DECODED TEXT = Yoda said, Do or do not, There is not try.

にゃるほどね.

Crypto++のインストールパッケージの作成

配布パッケージ作成方法(850)台湾積体電路製造

今流行りの豚にしないと!この野郎の悪いところは, GNUmakefile に全部書いてあるところだな. なにがなにやら. どうやら850ってのがM1を認識できるバージョンらしいぞ

X86ビルド

X86ターミナルで実行する.

tar zxf ../cryptopp-CRYPTOPP_8_5_0.tar.bz2
cd cryptopp-CRYPTOPP_8_5_0/
make CC=clang CXX=clang++ CXXFLAGS="-DNDEBUG -g2 -O3 -DCRYPTOPP_DISABLE_ASM -pipe \
-ffunction-sections -fdata-sections " PREFIX=/usr/local clean dynamic test

なんかstaticライブラリも作ろうとして失敗しているが,ま,ええかー. これで

lipo -info libcryptopp.dylib
Non-fat file: libcryptopp.dylib is architecture: x86_64

ARM64ビルド

ARM64ターミナルで実行する

tar zxf ../cryptopp-CRYPTOPP_8_5_0.tar.bz2
cd cryptopp-CRYPTOPP_8_5_0/
make CC=clang CXX=clang++ CXXFLAGS="-DNDEBUG -g2 -O3 -DCRYPTOPP_DISABLE_ASM -pipe \
-ffunction-sections -fdata-sections -stdlib=libc++" PREFIX=/usr/local clean dynamic test

なんかstaticライブラリも作ろうとして失敗しているが,ま,ええかー. これで

lipo -info libcryptopp.dylib
Non-fat file: libcryptopp.dylib is architecture: arm64

ここでインストールまでしてしまう.

fswatch -x /usr/local/ >& files.log &
sudo make CC=clang CXX=clang++ CXXFLAGS="-DNDEBUG -g2 -O3 -DCRYPTOPP_DISABLE_ASM -pipe \
-ffunction-sections -fdata-sections -stdlib=libc++" PREFIX=/usr/local install-lib cp libcryptopp.dylib /usr/local/lib install_name_tool -id /usr/local/lib/libcryptopp.dylib /usr/local/lib/libcryptopp.dylib

豚ビルド

だんだん世界が豚で埋め尽くされていく・・・

lipo -create -arch x86_64 ../../x86_64/cryptopp-CRYPTOPP_8_5_0/libcryptopp.dylib -arch arm64 \
libcryptopp.dylib -output ../universal/libcryptopp.dylib cp ../universal/libcryptopp.dylib /usr/local/lib install_name_tool -id /usr/local/lib/libcryptopp.dylib /usr/local/lib/libcryptopp.dylib

できたかな

lipo -info /usr/local/lib/libcryptopp.dylib
Architectures in the fat file: /usr/local/lib/libcryptopp.dylib are: x86_64 arm64​​​​​​​

いいようだな.

kill %1
fswatch_analyze.sh -c _binary files.log
pkgbuild --identifier cryptopp --root _binary cryptopp850-osx11.2.pkg

Version830

AppleのM1で動かないらしいので入れ替える. で, そのまんまでは 

'_mm256_xor_si256' requires target feature 'avx2', but would be inlined into function \
'ChaCha_OperateKeystream_AVX2' that is compiled without support for 'avx2'

的なエラーが出てビルドできない. 前はAVX2オプションつけて逃げたのだが, AVXってのはIntel独特の技術だから, M1用には使えないだろう.てゆうか, makefile 見当たらないのに, どうやってビルドしているんだろう.

試行錯誤の結果

tar xf fswatch-1.15.0.tar
cd fswatch-1.15.0
./configure --prefix=/usr/local
make distclean
make -f GNUmakefile CC=clang CXX=clang++ PREFIX=/usr/local CXXFLAGS="-DNDEBUG -g2 -O3\
-DCRYPTOPP_DISABLE_ASM" AR="ar" ARFLAGS="-r" clean dynamic static test fswatch -x /usr/local/ >& files.log & sudo make -f GNUmakefile CC=clang CXX=clang++ PREFIX=/usr/local CXXFLAGS="-DNDEBUG -g2\
-O3 -DCRYPTOPP_DISABLE_ASM" AR="ar" ARFLAGS="-r" install swatch_analyze.sh -c _binary files.log pkgbuild --identifier cryptopp --root _binary cryptopp830-osx10.15.pkg

Version810

fswatch_analyze.shがバグっていたので入れ替える.staticライブラリーなんて,つかわないのでは ? と思ったが古すぎてもはやビルドしないのか? 新しいのではどうだ? Macがデフォルトでgmakeであるので, GNUmakefile でmakeしているみたいだが. デフォルトでいっぱいコンパイルオプションがついたが, エラーするので, 適宜追加してみる.

cd cryptopp810
fswatch -x /usr/local > files.log &
sudo make CC=clang CXX=clang++ CXXFLAGS="-DNDEBUG -g2 -O3 -DCRYPTOPP_DISABLE_MIXED_ASM -pipe \
-ffunction-sections -fdata-sections -march=core-avx2 -msha" PREFIX=/usr/local AR="ar" ARFLAG="-r" clean dynamic static test install kill %1 fswatch_analyze.sh -c _binary files.log pkgbuild --identifier cryptopp --root _binary cryptopp810-osx10.14.pkg

これでどうだ?

Version565

なんか古くなってきたので入れ替える.

cd cryptopp5.6.5
fswatch -x /usr/local > files.log &
sudo make CC=clang CXX=clang++ PREFIX=/usr/local clean dynamic static install
sudo cp libcryptopp.so /usr/local/lib
sudo make -f Makefile PREFIX=/usr/local clean static install
kill %1
fswatch_analyze.sh -c _binary files.log
pkgbuild --identifier cryptopp --root _binary cryptopp562-osx10.10.pkg

Version562

暇だから,上記の配布パッケージを自分で作成したい場合,ソースファイルをここからダウンロードして

cd cryptopp562
fswatch -x /usr/local > files.log &
sudo make -f Makefile PREFIX=/usr/local clean dynamic
sudo cp libcryptopp.so /usr/local/lib
sudo make -f Makefile PREFIX=/usr/local clean static install
kill %1
fswatch_analyze.sh -c _binary files.log
pkgbuild --identifier cryptopp --root _binary cryptopp562-osx10.10.pkg