【问题标题】:Public Private Key Encryption Tutorials公钥私钥加密教程
【发布时间】:2012-04-17 19:22:20
【问题描述】:

你知道用 C++ 或 C 演示公钥加密 (PPKE) 的教程吗?

我正在尝试了解它的工作原理,并最终使用 Crypto++ 使用公共私钥创建我自己的加密。也许有 Crypto++ PPKE 教程?

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

【问题讨论】:

  • 我同意创建一个简单的加密程序来理解这个概念是个好主意,但不要推出自己的加密程序(或算法)并在生产中使用它.这是非常不安全的软件的秘诀。请参阅 Eric Lippert's blog 以获得很好的解释(以及对甚至困扰专家加密系统的密钥管理问题的解释)。
  • @JakeM:你读过public key cryptography 上的维基百科文章吗?它对私钥和公钥系统有很好的描述。
  • “记住:任何人都可以设计一个他自己无法破解的安全系统。即使是专家也经常会出错。业余爱好者会做对的几率非常低。” ——布鲁斯·施奈尔
  • 它只是被称为“公钥加密”——“私有”位是隐含的。并且有很多关于 PKE 基本概念的很好的解释——你不清楚什么?

标签: c++ c cryptography public-key-encryption


【解决方案1】:

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

这篇文章非常适合想要了解 RSA 但没有扎实的数学背景的程序员。这是唯一让我真正了解 RSA 的文章。它不包含 C 或 C++ 代码,但一旦您了解它的工作原理,您应该能够编写自己的代码。 (虽然我同意其他人的观点,不推荐,但对理解RSA还是有帮助的)希望对你有帮助!

【讨论】:

    【解决方案2】:

    这是我不久前写的玩具版 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;
    }
    

    当然,这仅涵盖加密和解密本身——这距离成为一个完整的安全系统还有很长的路要走。

    就像 cmets 所指出的,这纯粹是为了支持对算法的理解。我从来没有认真使用过它,而且可能永远也不会。尽管支持真正的密钥大小是相当微不足道的,但我是否会这样做是值得怀疑的——如果我这样做了,有人可能会将其误认为是应该用于真实数据的东西,而我并不真正打算这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 2013-04-06
      • 2013-05-07
      相关资源
      最近更新 更多