openssl3.2 - 检查rsa证书和私钥是否匹配(快速手搓一个工具)

这篇具有很好参考价值的文章主要介绍了openssl3.2 - 检查rsa证书和私钥是否匹配(快速手搓一个工具)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

openssl3.2 - 检查rsa证书和私钥是否匹配(快速手搓一个工具)

概述

在学习openssl官方的/test/certs的脚本实现, 做到第30个脚本实验时, 发现根CA证书和key不匹配.
估计做实验时, 遇到脚本需要的文件, 就随便拷贝一个同名的文件过来, 导致证书和key不是一个脚本产生的, 所以不匹配

就想从前面的实验中, 找出匹配的证书和key来做实验, 肯定有啊.

这事应该openssl编程就能做到. 不过时间紧, 先不用openssl编程来做.
看有没有简单暴力的方法.

在网上找到如下2个openssl命令, 可以输出证书和key的模块信息.

// 打印X509证书的模块信息
openssl x509 -inform PEM -modulus -in ca-cert.pem -noout

// 打印rsa私钥的模块信息
openssl rsa -inform PEM -modulus -in ca-key.pem -noout

这2个命令输出的都是文本信息, 如果这2个文本信息相同, 则说明这2个证书和私钥是匹配的
按照这个原理, 手工输入命令, 然后人肉比对. 原始操作就是这样的, 就可以知道一对证书和key是否匹配.

可以重定向为文件(e.g. openssl x509 -inform PEM -modulus -in ca-cert.pem -noout > cert_info.txt)

然后用win10自带的FC.exe 就可以比较2个文件是否相同(e.g. fc file_a file_b), 如果fc返回0, 这2个文件就是相同的.

但是作为研发, 能用程序做的, 绝对不可能用人工操作来折磨自己, 那肯定不能够啊.

用了一个小时, 手搓了一个原始工具来干活.

效果

openssl3.2 - 检查rsa证书和私钥是否匹配(快速手搓一个工具),openSSL,openSSL

笔记

编程环境

vs2019 vc++ MFC + Dialog模板

界面控件的设置

对话框设置为可以接收文件.
2个编辑框(证书和key), 也设置为可以接收文件.

增加文件拖拽的类

从CEdit继承一个类CDropEdit(用类向导很方便), 加入拖拽消息处理(用类向导加入消息处理), 框架代码不用自己写.

#pragma once
#include <afxwin.h>
class CDropEdit :
    public CEdit
{
public:
    DECLARE_MESSAGE_MAP()
    afx_msg void OnDropFiles(HDROP hDropInfo);
};


#include "pch.h"
#include "CDropEdit.h"
BEGIN_MESSAGE_MAP(CDropEdit, CEdit)
	ON_WM_DROPFILES()
END_MESSAGE_MAP()


void CDropEdit::OnDropFiles(HDROP hDropInfo)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	// 拖拽实现很多, 可以参考msdn, 我就直接用下面这位同学分享的片段
	// https://blog.csdn.net/wrl112/article/details/120335725
	
    TCHAR szTmp[MAX_PATH * 2];
    CString strVal;
    unsigned int nRet = 0, nInx = 0;

    do {
        nRet = ::DragQueryFile(hDropInfo, nInx++, szTmp, sizeof(szTmp));
        if (nRet > 0) {
            strVal += szTmp;
        }
        else {
        }
        break;
    } while (1);
    ::DragFinish(hDropInfo);
    SetWindowText(strVal);

	CEdit::OnDropFiles(hDropInfo);
}

RSA证书和key是否匹配的实现

#include <string>

std::string my_W2A(std::wstring str)
{
	USES_CONVERSION;
	std::string str_rc = W2A(str.c_str());
	return str_rc;
}

void CCertKeyMatchDlg::OnBnClickedButtonMatch()
{
	// TODO: 在此添加控件通知处理程序代码
	CString csFileA;
	CString csFileB;
	CString csTmp;

	std::string strFileA;
	std::string strFileB;

	char szBuf[10 * 1024];

	int i_rc = 0;

	do {
		this->SetWindowTextW(_T(""));

		m_EditFileA.GetWindowText(csFileA);
		m_EditFileB.GetWindowText(csFileB);

		if ((csFileA.GetLength() <= 0) || (csFileB.GetLength() <= 0))
		{
			TRACE(_T("文件名必须都不为空"));
			break;
		}

		strFileA = my_W2A((LPCWSTR)csFileA);
		strFileB = my_W2A((LPCWSTR)csFileB);

		/*
		// 打印X509证书的模块信息
		openssl x509 -inform PEM -modulus -in ca-cert.pem -noout

		// 打印rsa私钥的模块信息
		openssl rsa -inform PEM -modulus -in ca-key.pem -noout
		*/

		sprintf(szBuf, "openssl x509 -inform PEM -modulus -in %s -noout > cert_info.txt", strFileA.c_str());
		i_rc = system(szBuf);
		_ASSERT(0 == i_rc);

		sprintf(szBuf, "openssl rsa -inform PEM -modulus -in %s -noout > key_info.txt", strFileB.c_str());
		i_rc = system(szBuf);
		_ASSERT(0 == i_rc);

		i_rc = system("fc cert_info.txt key_info.txt");
		csTmp.Format(_T("证书和私钥%s"), (0 == i_rc) ? _T("匹配") : _T("不匹配"));
		this->SetWindowTextW(csTmp);
	} while (false);


}

void CCertKeyMatchDlg::OnDropFiles(HDROP hDropInfo)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	CDialogEx::OnDropFiles(hDropInfo);
}

在程序中加入环境变量

在对话框初始化时, 加入了openssl的path, 除非必要, 不污染环境变量.

BOOL CCertKeyMatchDlg::OnInitDialog()
{
// ...
	// TODO: 在此添加额外的初始化代码

	char* psz_env_buf = new char[1024 * 1024];
	if (NULL != psz_env_buf)
	{
		char* psz_env = getenv("path");
		// ::SetEnvironmentStrings()
		sprintf(psz_env_buf, "path=%s;%s", "C:\\openssl_3d2\\bin", psz_env);

		int i_rc = _putenv(psz_env_buf);
		_ASSERT(0 == i_rc);

		delete[]psz_env_buf;
	}


	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

加入环境变量后, 调用程序时, 就不用写全路径, 就可以调用openssl.exe了.

备注

感觉自己还挺机智的:P

备注

因为cert和key的pem是成对的, 用everything看一下, 将cert.pem列出来, 然后进入对应目录找一下是否有对应的key.pem, 最好从生成时间早的目录找, 然后用这个工具比对.
很快就找出来了.
openssl3.2 - 检查rsa证书和私钥是否匹配(快速手搓一个工具),openSSL,openSSL文章来源地址https://www.toymoban.com/news/detail-821706.html

END

到了这里,关于openssl3.2 - 检查rsa证书和私钥是否匹配(快速手搓一个工具)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用 OpenSSL 扩展来实现公钥和私钥加密

    首先,你需要生成一对公钥和私钥。可以使用 OpenSSL 工具来生成: 1、生成私钥 2、从私钥生成公钥: 现在你有了一个私钥( private_key.pem )和一个对应的公钥( public_key.pem )。下面是如何在 PHP 中使用它们进行加密和解密: 3、检测是否支付OPENSSL,或用phpinfo(); 上述代码中,

    2024年02月03日
    浏览(39)
  • Nginx 使用 HTTPS(准备证书和私钥)

    生成私钥 这会生成一个加密的私钥文件server.key。 执行openssl genrsa命令时,使用-des3参数会要求设置一个密码来加密生成的私钥。为了安全起见,密码应该足够复杂和长。使用-des3生成受密码保护的私钥也是更安全的做法。 另外,在后续生成证书过程中,需要输入同样的密码才能使

    2024年02月12日
    浏览(31)
  • RSA算法习题 (采用RSA算法,其中e=7,p=11,q=13,求出公钥和私钥,并求出明文85进行加密后的密文。)

    1、采用RSA算法,其中e=7,p=11,q=13,求出公钥和私钥,并求出明文85进行加密后的密文。 2. 找出质数 P、Q P=11 Q=13 3. 计算公共模数 N = P * Q = 143 4. 欧拉函数 Φ(N) = (P-1)*(Q-1) = 10 *12 = 120 5. 计算公钥E 1Eφ(N) 所以1E120 E的取值范围{3,7,9,11,13,17,19,...,117,119} E的取值必须和φ(N)互质 取

    2024年02月09日
    浏览(73)
  • 【openssl】RSA 生成公钥私钥 |通过私钥获取公钥

    通过博客:Window系统如何编译openssl 编译出openssl.exe(位于apps文件夹下)。 现在需要使用它获得公钥私钥、通过私钥获取公钥 目录 说明!!! 一.定位openssl.exe目录 二、进入命令cmd 三、生成私钥 四、已知的私钥替换模板私钥 五、通过私钥生成公钥 a.生成公钥私钥:跳过第四

    2024年02月04日
    浏览(41)
  • openssl3.2 - exp - export RSA pubKey from RSA privKey on memory

    官方给的例子(openssl3.2 - 官方demo学习 - encode - rsa_encode.c)是基于文件操作的. 我的工程只需要openssl 操作内存数据, 改了一个操作buffer的版本. 从内存中的RSA私钥数据, 导出RSA公钥来用.

    2024年03月11日
    浏览(36)
  • openssl安装,openssl生成私钥以及openssl生成证书

    首先安装perl工具,下载地址: Download Install Perl - ActiveState Download Perl 5.32 and 5.28 from ActiveState get precompiled Perl distribution. ActiveState Perl is free to download. https://www.activestate.com/activeperl/downloads 我下载了 这个版本(安装过程下一步下一步即可) 我安装在 C:Perl64 然后下载openssl: /s

    2024年02月08日
    浏览(44)
  • openssl3.2 - 官方demo学习 - encode - rsa_encode.c

    命令行参数 server_priv_key.pem client_priv_key.pem 这2个证书是前面certs目录里面做的 官方这个程序有bug, 给出2个证书, 还要从屏幕上输入 if (OSSL_DECODER_from_fp(dctx, f) == 0) { /* 在这里阻塞住了, 让在屏幕上输入东西, 让我输入啥啊 ? 关键是输入了, 回车也不返回程序. 先放这里, 等整明白了

    2024年02月01日
    浏览(35)
  • openssl3.2 - 官方demo学习 - signature - rsa_pss_direct.c

    用RSA私钥签名 d2i_PrivateKey_ex()可以从内存载入私钥数据, 得到私钥EVP_PKEY* 从私钥产生ctx, 对ctx进行签名初始化, 设置ctx的padding填充模式 摘要算法选用SHA256, 对ctx设置摘要算法 尝试签名, 得到签名长度, 然后进行私钥签名, 得到私钥签名buffer. 用RSA公钥验签 d2i_PublicKey()可以从内存

    2024年01月18日
    浏览(60)
  • openssl3.2 - 官方demo学习 - signature - rsa_pss_hash.c

    对私钥对明文做签名(摘要算法为SHA256) 用公钥对密文做验签(摘要算法为SHA256)

    2024年01月19日
    浏览(29)
  • openssl3.2 - 官方demo学习 - pkey - EVP_PKEY_RSA_keygen.c

    官方指出 : RSA key 如果小于2048位, 就属于弱key 官方demo中, 给出的默认key长度为4096位 从名字生成上下文 初始化上下文 设置上下的key位数 设置质数数量为2 产生RSA Key. (在我的本本上, 单步调试时, 感觉产生 RSA key时, 卡了一下, 大概不到1秒钟) 打印rsa key内容(可以得到 n, e, d, p,

    2024年01月17日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包