7

C ++またはCでの公開秘密鍵暗号化(PPKE)を示すチュートリアルを知っていますか?

私はそれがどのように機能するかを学び、最終的にCrypto++を使用して公開秘密鍵を使用して独自の暗号化を作成しようとしています。たぶん、Crypto ++ PPKEチュートリアルがありますか?

たぶん誰かが公開鍵と秘密鍵の関係(もしあれば)を説明できますか?概念を理解するための単純なPPKEプログラムを作成するために使用できる、非常に単純な公開鍵と秘密鍵の値('char * 32'、'char / 32'など)を誰かが提案できますか?

4

2 に答える 2

10

www.muppetlabs.com/~breadbox/txt/rsa.html

この記事は、RSA を理解したいがしっかりした数学のバックグラウンドを持っていないプログラマー向けに非常によく書かれています。実際にRSAを理解できる唯一の記事です。C または C++ コードは含まれていませんが、その仕組みを理解すれば、独自のコードを記述できるはずです。(推奨されていないという意見には同意しますが、RSA を明確に理解することは依然として役立つはずです)

于 2012-04-04T05:25:06.297 に答える
8

これは、私が以前に書いた 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;
}

もちろん、これは暗号化と復号化自体をカバーするだけであり、完全セキュリティ システムには程遠いものです。

コメントが指摘したように、これは純粋にアルゴリズムの理解をサポートすることを目的としています。私はそれを真剣に使用したことはありませんし、おそらく今後も使用することはありません。実際のキーサイズをサポートすることはかなり些細なことですが、私がそれを行うかどうかは疑問の余地があります.もしそうすると、誰かがそれを実際のデータで使用されるべきものと間違えるかもしれません.これは私が本当に意図していません.

于 2012-04-04T05:18:14.103 に答える