Curve25519 是目前最高水平的 Diffie-Hellman函数,适用于广泛的场景,由Daniel J. Bernstein教授设计。在密码学中,Curve25519是一个椭圆曲线提供128位安全性,设计用于椭圆曲线Diffie-Hellman(ECDH)密钥协商方案。它是最快的ECC曲线之一,并未被任何已知专利所涵盖。
给定一个用户的32字节密钥,curve25519计算该用户的32字节公钥。给定该用户的32字节密钥和另一个用户的32字节公钥,curve25519计算一个32字节的共享密钥提供给这两个用户使用。然后可以使用这个秘密对两个用户进行身份验证和信息加密。
curve25519库以非常高的速度计算curve25519函数。该库应用领域广泛。您可以并且应该将它应用在自己的程序中,而不是链接到共享库;编译后的代码大约为16KB,这取决于CPU。
下载及编译
wget http://cr.yp.to/ecdh/curve25519-20050915.tar.gz
gunzip < curve25519-20050915.tar.gz | tar -xf -
cd curve25519-20050915
env CC='gcc -O2' make
cp `cat FILES.lib` yourproject/
cat Makefile.lib >> yourproject/Makefile
对于将使用curve25519的任何C程序,修改该程序以包含curve25519.h;同时修改makefile以将该程序与curve25519.a链接,并声明该程序依赖于curve25519.a和curve25519.h。
在程序内部,要生成一个32字节的curve25519密钥,首先从一个加密安全源 :mysecret[0], mysecret[1], …, mysecret[31], 生成一个秘密的32个随机字节。然后照如下方式做:
mysecret[0] &= 248;
mysecret[31] &= 127;
mysecret[31] |= 64;
生成一个32字节Curve25519 秘钥mysecret[0], mysecret[1], …, mysecret[31]。
未来该库版本将支持一个curve25519_压缩函数,它将128个字节散列压缩为32个字节,增加了一些对不足的随机数生成器的保护;一个curve25519_钳函数,它将32个字节转换为密钥;以及一个最容易使用的组合的curve25519_秘钥生成函数,它直接将128个字节转换为密钥。
curve25519(mypublic,mysecret,basepoint);
其中常量basepoint
为:
const unsigned char basepoint[32] = {9};
以后的库版本将支持更简洁的curve25519_公共函数。
给定另一用户的Curve25519公共秘钥hispublic[0], hispublic[1], …, hispublic[31], 调用
curve25519(shared,mysecret,hispublic);
生成32-byte共享秘钥shared[0], shared[1], …, shared[31]. 另一个人可以根据自己的私钥以及你的公钥生成相同的共享秘钥。
然后你们两个都可以对这个共享秘钥进行散列运算,并将结果作为一个密钥使用,例如用于 Poly1305-AES。
以后的库版本将支持一个curve25519_扩展函数直接将一个32Byte秘钥运用散列运算生成128 byte用于作为一个秘钥,并且最容易使用的,一个组合curve25519_共享函数。
[Ed25519和Curve25519解释] https://blog.csdn.net/stella_alash/article/details/73658473
[Curve25519加解密 和 Ed25519加验签的使用] https://blog.csdn.net/farley119/article/details/87875201
[Ed25519算法] https://blog.csdn.net/u013137970/article/details/84573265
[android ed25519实现] https://mvnrepository.com/artifact/click.kobaken/ed25519/1.0.0
[[ed25519 C实现] https://github.com/orlp/ed25519
[ed25519 Java实现] https://github.com/str4d/ed25519-java