# tiny-rsa **Repository Path**: fmcdr/tiny-rsa ## Basic Information - **Project Name**: tiny-rsa - **Description**: RSA 非对称加密算法的 Common Lisp 实现 - **Primary Language**: Common Lisp - **License**: BSD-2-Clause - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-03-25 - **Last Updated**: 2023-05-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # tiny-rsa #### 介绍 RSA 非对称加密算法的 Common Lisp 实现,自包含 sha256 哈希函数以及 base64 编/解码函数。对第三方库的依赖很少(当前只依赖 flexi-streams) 这只是一个简易的实现,且没有计划发展成更完备的项目,毕竟成熟的开源项目那么多。我只是看了[李永乐老师的讲课视频](https://www.bilibili.com/video/av26639065/)后,发现 RSA 的算法很简单,写着玩的。 几点提示: 1. 公钥和私钥都可以用来加密和解密数据,公钥加密的数据只有私钥才能解密,反过来,私钥加密的数据只有公钥才能解密。 2. 通常公钥指数选择比较小,所以运算量比较少。而私钥指数选择比较大,所以运算量比较大。 3. 公钥通常是公开的,而私钥是私人持有的。因此,文件加密的应用场景通常是公钥加密,私钥解密。 3. 私钥加密的应用场景是文件签名。私钥加密的对象通常不是文件,而是文件的哈希值。发布者公布文件的签名后,所有持有公钥的人都可以解密文件签名,得到文件初始的哈希值。再对文件做一次哈希校验,将得到的值与解密得到的值做比对就可以验证文件的完整性。 #### 安装教程 cd ~/quicklisp/local-projects git clone https://gitee.com/fmcdr/tiny-rsa.git # in lisp REPL (ql:quickload :tiny-rsa) # build the tiny rsa cli tool (ql:quickload :rsa-cli) (asdf:make :rsa-cli) #### API 1. `(encrypt-data key data) => (simple-array (unsigned 8))` - key - 密钥对象(结构体 rsa-key) - data - (simple-array (unsigned 8)) 加密一段二进制数据 2. `(decrypt-data key data) => (simple-array (unsigned 8))` - key - 密钥对象 - data - (simple-array (unsigned 8)) 解密一段二进制数据 3. `(exchange-encrypt key in out) => NIL` - key - 密钥对象 - in - stream - out - stream 将来自 in 的数据加密后发送到 out 4. `(exchange-decrypt key in out) => NIL` - key - 密钥对象 - in - stream - out - stream 将来自 in 的数据解密后发送到 out 5. `(encrypt-file key in-file out-file) => NIL` - key - 密钥对象 - in-file - pathname or namestring - out-file - pathname or namestring 将文件 in-file 加密后保存为 out-file 6. `(decrypt-file key in-file out-file) => NIL' 和 encrypt-file 相反 7. `(encrypt-text key text) => string (base64 encode)` - key - 密钥对象 - text - string 8. `(decrypt-text key text) => string` - key - 密钥对象 - text - string (base64 encode) 9. `(sign-file key file) => string (base64 encode)` - key - 密钥对象 - file - pathname or namestring 对文件进行签名,返回 base64 编码的 signature。 先对文件内容做sha256校验,得到哈希值(字符串),再将哈希值加密,得到 signature。 10. `(verify-file key file signature) => boolean` - key - 密钥对象 - file - pathname or namestring - signature - string (base64 encode) 验证文件签名,验证通过返回 T,验证不通过返回 NIL 11. `(gen-keys name &optional (bits 2048) => (values public-key private-key)` - name - string or symbol - bits - integer 生成密钥对,默认生成 2048 位长度的密钥,可以通过 bits 参数指定长度。