定価で買ったとしても満足してたと思う。3.0による数学・物理学表現[入門編]言語はフラッシュとActionScriptなんだけど、物理表現はプログラム言語関係ないからね。ActionScriptのJavaScriptへの書き換えには苦労しないんだけど、1年離れてるJavaScriptの基本的な書き方で四苦八苦。↑のデモ書くのに合計6時間かかった。JavaScriptのリハビリと息抜きを兼ねて少しづつやっていこう。何よりデモって楽しいんだよね。複雑じゃなく手を動かして物を作ってる感。UWP(C++/CX)→Java間のRSA+AES暗号化/復号化覚え書きここ何日か悪戦苦闘したので覚え書き。我ながら迂遠かつトリッキーな処理してるので、何をやってるのか忘れてしまう可能性が高いし。ここに記す処理の諸々は本番環境ではそのまま使う気は(当然)無いです。暗号については(も)ど素人なので、セキュリティ上の穴がある可能性が大であることは最初に述べておきます。最初はJavaで生成する例を見つけてその通りやろうとして、鍵データの保存/呼び出し方法で四苦八苦。考えたらこの部分は普通にOpenSSL使えばいいんじゃないか?情報も多いし。derまず普通にpem形式で出力、そのあとJavaで扱えるようder形式ファイルも出力。上のコマンドはサーバ上で走らせたもの。Windowsマシンでやる場合はオプション指定が微妙に違うらしいので注意。詳しくは↑の参考サイトを。次にRSA公開鍵をUWP(C++/CX)で扱える形にする。ここでかなりの試行錯誤。欲しかった情報を書いてくださっているブログを発見。「Base64エンコードしたmodulusとpublicExponent」つまり文字列を二つ公開鍵から生成すれば良さそうだと理解。以下のJavaコードを書く。}}//最後に文字列吐き出す処理。Base64.encodeBase64String(publickey.getPublicExponent().toByteArray());System.out.println("------------------------------------------");System.out.println(modules);System.out.println(pe);System.out.println("------------------------------------------");}ここでいちいちファイルアクセスするのもどうなのと思ったので、Java側でも秘密鍵/公開鍵ともに文字列データとして扱えないかと試行錯誤開始。stackoverflowを徘徊してると「秘密鍵の文字列化なんてダメ!絶対!!」的なレスがたくさん見られるのだけど、イマイチ意味が分からない。pemファイルも平文のファイルでしょ。「秘密鍵データにprivate_key.pemなんてわかりやすいファイル名つけて、中身は平文で保持」と「秘密鍵データをjarファイルの中に文字列定数として(今回は結局16進文字列にした)保持」の二つのやり方にセキュリテイ上の優劣があるのだろうか。}//文字列からキー生成。bytes;}以降はJava側ではこれで生成した秘密鍵データと公開鍵データの16進文字列を定数として埋め込み利用する。pemファイルでもderファイルでも何でも良かったんだけど、今後色んな環境でテストしていく中で毎回ファイルのパス指定を間違えて躓きそうだったのでこうしました。暗号化/復号化処理に必須の処理ではないです。次はUWP(C++/CX)側の処理。ここから情報が少なすぎて大変だった。問題は暗号化処理のサンプルコードで頻出する「System.Security.Cryptography」名前空間がUWPでは使えないこと。「Windows::Security::Cryptography」使えとのこと。結果web空間上に山ほどあるサンプルコードが参考にならなくなる。↑の参考ブログで使ってたRSACryptoServiceProviderはWindows::Security::Cryptographyにはないので、では何を使うのか?とググったりコードアシストで色々試したり。string.」一つだけ。するに「modulusとpublicExponentからcspBlobString生成しろ。その処理はUWP(C++/CX)使わなくても構わん。System.Security.Cryptography名前空間使って良し」とのこと。よって次の処理部分だけC#でやってみる。}これでできた文字列を使い、以降はUWP(C++/CX)でRSA暗号化処理。result;}Java側で復号。result;}暗号化の定石、「平文の暗号化はAES共通鍵方式で行い、添付する共通鍵をRSA方式で暗号化する」処理を実装。試しに長めの平文をRSA暗号化処理させてみたら、開発に使ってるi7搭載機でも引っかかる。何より今回の暗号化処理は最終的にはwebAPI実装の一部だから、POSTアクセスなら文字数制限ないけれどもあまりに長いクエリになるのは困る。32);}結果、暗号化データのbase64文字列、ivのbase64文字列、digestのbase64文字列をRSA暗号化した文字列が生成される。それをJava側で復号。decryptRSA(DIGEST_RSA64));System.out.println(dec);おそらく初回はこのAES復号処理はInvalidKeyExceptionで落ちる。リンクした参考先サイトのすべての皆さんに感謝。こんなコピペプログラマのやっつけで書いてるコードでない、理論に裏付けされた美しいコードが並んでます。暗号化について調べていてこのエントリにたどり着いた人がもしいたら、是非リンク先へ行ってみてください。したけど財布を買い替えた。