公钥私钥加密教程

8

您是否知道有关在C++或C中演示公钥私钥加密(PPKE)的教程?

我正在尝试学习它的工作方式,最终使用Crypto++创建自己的使用公共和私人钥匙的加密。也许有Crypto++ PPKE教程吗?

也许有人可以解释一下公钥和私钥之间的关系(如果有的话)? 有人能否建议我一些非常简单的公钥和私钥值(例如'char*32','char / 32'),以便创建我的简单PPKE程序来理解概念?


7
我同意创建一个简单的加密程序来理解概念是个好主意,但在生产中不要自己编写加密程序(或算法)并使用它。那会导致非常不安全的软件。请参考 Eric Lippert 的博客详细了解其中原因(以及即使对于专家加密系统而言,密钥管理问题也难以解决的解释)。 - Adam Mihalcin
@JakeM:你有没有读过维基百科上关于公钥密码学的文章?它对私钥和公钥系统有很好的描述。 - wallyk
1
请记住:任何人都可以设计一个自己无法破解的安全系统。即使专家们也经常会出错。业余爱好者能够设计出正确的安全系统的可能性极低。——Bruce Schneier - blueshift
它只被称为“公钥加密” - “私有”部分是隐含的。而且,有很多关于PKE基本概念的好解释 - 你不清楚什么? - Nick Johnson
2个回答

10

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

该文章适合想要理解 RSA 的程序员,但数学基础不够扎实的人阅读。这是唯一一篇让我真正理解 RSA 的文章。虽然它不包含 C 或 C++ 代码,但一旦你理解了它的工作原理,就应该能够自己编写代码。(虽然我同意其他人的观点,不建议自己编写实现,但它仍有助于清晰地理解 RSA)。希望对您有所帮助!


8
这是我写的RSA玩具版代码,它只使用32位数字,因此被称为"玩具版"。要提供任何有意义的安全级别,您需要支持大得多的数字进行数学运算(典型密钥范围大约在1024-4096位左右,尽管后者可能没有多大作用)。
尽管如此,这确实实现了真正的RSA算法。只需要很少的修改就可以插入一个大数字包,使这个代码可以处理实际大小的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;
}

当然,这只涵盖了加密和解密本身--离完整的安全系统还有很长的路要走。
正如评论所指出的那样,这仅旨在支持对算法的理解。我从未将其用于严肃的用途,可能永远也不会。虽然支持实际密钥大小相当简单,但是否会这样做还存在争议--如果我这样做了,某人可能会错误地认为它应该用于真实数据,而我并没有这个意图。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接