【发布时间】:2014-12-13 13:21:04
【问题描述】:
我正在开发一个用于 RSA 加密的库,以用于微控制器等小型设备。我想知道是否有人已经有过做这种事情的经验。
到目前为止我已经尝试过:
我尝试的第一件事是从这个库http://axtls.sourceforge.net/ 中获取一些代码。我不想要任何 TLS 特性,因为它太复杂(而且太大)。我在从内存中加载字节时遇到问题,也许我应该使用来自它们的加载程序例程,DER 读起来很无聊,ASN1 是二进制 XML,我已经完成了 XML,我没有空间来解码 XML也。
也许我不应该使用 openssl 转储工具获取字节,因为我不知道互操作性问题。
第二次尝试是使用库 https://github.com/wernerd/ZRTPCPP/blob/master/bnlib/bn16.c 中的代码。问题是 CRT 算法太大而无法适应,即使它提供了一些性能提升,但我不需要它,因为我的数据包很小,我不会使用更长的密钥。我不能有更长的密钥,因为我没有足够的 RAM 内存。
我更喜欢有一些小型图书馆。这个库也做了太多的指针间接。 从 Stackoverflow 阅读更多内容,我找到了这段代码,但我从中得到了除零,我不确定在加载大数字时是否有字节序问题。 https://github.com/Coder-666/uRSAlib/blob/master/uRSA/BN.c
这些库看起来很有前途,但我没有时间测试它们: http://cryptopp.com/#download。 https://github.com/jedisct1/libsodium/tree/master/src/libsodium
就是这样,我需要尽快完成,因为我几乎没时间了,如果有人知道一些真正适用于 8 位小东西的小型 RSA 库,将不胜感激,否则我将使用类似的东西AES 和固定密钥,但这对安全性来说不是最理想的。 (更新:现在我正在探索使用 ECC 曲线,因为它们使用固定数量的内存并且也需要更少的内存,根据本文http://eprint.iacr.org/2013/375.pdf)
问题:
是否可以在少于 15Kb 的 PIC 十六进制代码中实现 RSA 加密,或者是否有一些已知的库可以做到这一点?
参考资料:
How to encrypt a string using public key cryptography
Library for RSA implementation in pure C
Are there any very simple RSA implementation in C++
Implementation of RSA without dynamic allocation
implementing a bignum library for rsa encryption
http://en.wikipedia.org/wiki/RSA
http://www.di-mgt.com.au/rsa_alg.html#encryption 我也从 PGP 项目中查看了这个库,但它太复杂了。
http://fossies.org/dox/pgpsrc658unix-gnu/dir_d8387bb0a43f1d00e085a9a2c8a94120.html
http://www.math.mtu.edu/mathlab/COURSES/holt/dnt/phi4.html
http://cacr.uwaterloo.ca/hac/(应用密码学,这个看起来很有前途,我正在看)。
ftp://ftp.cs.pdx.edu/smn/ipsec/skip/ 值得一看的东西。
http://www.codeproject.com/Articles/14462/Build-your-own-cryptographically-safe-server-clien
http://www.codeproject.com/script/Articles/ViewDownloads.aspx?aid=8536
http://www.codeproject.com/script/Articles/ViewDownloads.aspx?aid=5266
http://www.codeproject.com/Articles/60108/BigInteger-Library
【问题讨论】:
-
那么你有一个具体的问题在这里吗?我不知道你在追求什么......
-
我只是想要一些方向。也许我应该在另一个地方发帖。
-
老实说,无意冒犯,听起来你有点过头了。此外,您可能有一些阻碍您前进的技术偏见; DER 解析应该不太痛苦,虽然有很多理由不喜欢 ASN.1,但它不是真正意义上的“二进制 XML”(除了在作为一种将结构化数据存储在二进制字符串中的方法的极其松散的比喻意义)。
-
如果 ECC 可以接受,我会使用 Curve25519 和 Salsa20Poly1305 进行实际加密。 Libsodium 是一种实现,尽管您可能需要删除不需要加密的部分以减少代码大小。作为最小代码库,还有TweetNaCl,但我不太喜欢缩小。
-
我就是这么做的,我会用Curve25519,我会看看TweetNaCl,谢谢。
标签: c cryptography rsa microcontroller public-key-encryption