Mac 使用OpenSSL生成 DSA公钥与私钥

2 篇文章 0 订阅

mac 自带openssl环境,不用安装,直接使用openssl就可以
打开终端,进入到即将生成密钥文件的目录下,然后输入命令:openssl,进入OpenSSL命令行,然后输入dsaparam -out dsaparam.pem1024生成参数文件这里写图片描述
然后输入gendsa -out dsa_private_key.pem dsaparam.pem生成私钥,然后输入pkcs8 -topk8 -inform PEM -in dsa_private_key.pem -outform PEM -nocrypt -out dsa_private_key_pkcs8.pem将私钥转换成PKCS8格式,然后输入dsa -in dsa_private_key_pkcs8.pem -pubout -out dsa_public_key.pem生成公钥,最后exit,退出OpenSSL。
这里写图片描述
此时在你当前目录下会出现4个文件:dsaparam.pem、dsa_private_key.pem、dsa_private_key_pkcs8.pem、dsa_public_key.pem。
可以利用vim *查看密钥文本。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的DSA签名算法的实现,其中包含了公共参数、公钥私钥、签名、验证算法。 ```c++ #include <iostream> #include <cstdlib> #include <ctime> #include <cmath> using namespace std; // 随机数生成函数 int GenerateRandom(int min, int max) { return rand() % (max - min + 1) + min; } // 求幂函数 int PowMod(int base, int exponent, int modulus) { int result = 1; base = base % modulus; while (exponent > 0) { if (exponent & 1) result = (result * base) % modulus; exponent = exponent >> 1; base = (base * base) % modulus; } return result; } // 求逆元函数 int InverseMod(int a, int m) { int m0 = m, t, q; int x0 = 0, x1 = 1; if (m == 1) return 0; while (a > 1) { // q是商,t是余数 q = a / m; t = m; // m是余数,a是除数,x0和x1是上一次计算的结果 m = a % m; a = t; t = x0; x0 = x1 - q * x0; x1 = t; } if (x1 < 0) x1 += m0; return x1; } // DSA签名函数 void DSASign(int message, int& p, int& q, int& g, int& x, int& r, int& s) { int k = GenerateRandom(2, q - 1); // 随机数k r = PowMod(g, k, p) % q; // r的计算 int k_inv = InverseMod(k, q); // k的逆元 s = (k_inv * (message + x * r)) % q; // s的计算 } // DSA验证函数 bool DSAVerify(int message, int p, int q, int g, int y, int r, int s) { if (r < 1 || r > q || s < 1 || s > q) return false; int w = InverseMod(s, q); int u1 = (message * w) % q; int u2 = (r * w) % q; int v = ((PowMod(g, u1, p) * PowMod(y, u2, p)) % p) % q; return v == r; } int main() { srand(time(0)); // 公共参数 int p = 23; int q = 11; int g = 2; // 私钥公钥 int x = 6; int y = PowMod(g, x, p); // 签名 int message = 10; int r, s; DSASign(message, p, q, g, x, r, s); // 验证 bool result = DSAVerify(message, p, q, g, y, r, s); if (result) cout << "DSA验证成功!" << endl; else cout << "DSA验证失败!" << endl; return 0; } ``` 在代码中,我们首先定义了生成随机数和求幂函数,然后定义了求逆元函数。接下来我们实现了DSA签名函数和DSA验证函数,其中签名函数使用了随机数k,计算r和s。而验证函数则是按照DSA的流程进行计算,最后判断得到的v是否等于r。 在main函数中,我们先定义了公共参数p、q、g,然后生成私钥x和对应的公钥y。接着我们对消息进行签名,并使用公钥进行验证,最后输出验证结果。 需要注意的是,由于DSA签名算法涉及到了大数计算,如果签名的消息太大,那么在计算的时候可能会出现溢出的情况。因此,在实际使用中需要对算法进行优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值