これは、私が以前に書いた RSA の玩具バージョンです。おもちゃにしているのは、32 ビットの数値しか使用しないことです。意味のあるレベルのセキュリティを提供するには、計算のためにはるかに大きな数値をサポートする必要があります(通常のキー範囲は 1024 ~ 4096 ビット程度ですが、後者はおそらくあまり効果がありません)。
それにもかかわらず、これは実際の RSA アルゴリズムを実装します。bignum パッケージをプラグインするのに比較的時間がかからないため、このコードは実用的なサイズの RSA キーで動作します (ただし、他のほとんどの実装はおそらくより高速です)。
#include <iostream>
#include <iterator>
#include <algorithm>
#include <vector>
#include <functional>
const int e_key = 47;
const int d_key = 15;
const int n = 391;
struct crypt : std::binary_function<int, int, int> {
int operator()(int input, int key) const {
int result = 1;
for (int i=0; i<key; i++) {
result *= input;
result %= n;
}
return result;
}
};
int main() {
std::string msg = "Drink more Ovaltine.";
std::vector<int> encrypted;
std::transform(msg.begin(), msg.end(),
std::back_inserter(encrypted),
std::bind2nd(crypt(), e_key));
std::transform(encrypted.begin(), encrypted.end(),
std::ostream_iterator<char>(std::cout, ""),
std::bind2nd(crypt(), d_key));
std::cout << "\n";
return 0;
}
もちろん、これは暗号化と復号化自体をカバーするだけであり、完全なセキュリティ システムには程遠いものです。
コメントが指摘したように、これは純粋にアルゴリズムの理解をサポートすることを目的としています。私はそれを真剣に使用したことはありませんし、おそらく今後も使用することはありません。実際のキーサイズをサポートすることはかなり些細なことですが、私がそれを行うかどうかは疑問の余地があります.もしそうすると、誰かがそれを実際のデータで使用されるべきものと間違えるかもしれません.これは私が本当に意図していません.