国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【crypto++使用】使用crypto++庫(kù)函數(shù)運(yùn)行RSA非對(duì)稱加密

這篇具有很好參考價(jià)值的文章主要介紹了【crypto++使用】使用crypto++庫(kù)函數(shù)運(yùn)行RSA非對(duì)稱加密。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

系列文章目錄

1.(全網(wǎng)最詳細(xì)攻略)【Crypto++】在Visual studio2022中運(yùn)行Cryptopp



前言

crypto++是一個(gè)開源密碼學(xué)函數(shù)庫(kù),里面含有很多加密函數(shù)的庫(kù)供大家引用,在官網(wǎng)中也能看到許多代碼示范樣例。
本文將記錄如何使用開發(fā)環(huán)境:visual studio,引用crypto++的庫(kù)編寫RSA加密的代碼。


一、RSA加密過程、步驟

RSA的安全性依賴于大數(shù)分解,由于進(jìn)行的都是大數(shù)計(jì)算,使得RSA最快的情況也比DES慢上好幾倍,無論是軟件還是硬件實(shí)現(xiàn)。速度一直是RSA的缺陷。一般來說只用于少量數(shù)據(jù)加密。多用于數(shù)字簽名。下面是數(shù)字簽名的步驟:

  • 待發(fā)送消息(message)利用Hash函數(shù),生成信息的摘要
  • 私鑰加密摘要,生成”數(shù)字簽名”(signature)
  • 發(fā)送message+signature
  • 公鑰解密簽名
  • message重新生成摘要,與發(fā)送過來的摘要進(jìn)行比較

公鑰和私鑰:公鑰和私鑰是成對(duì)的,它們互相解密。

  1. 加密:公鑰加密,私鑰解密。
  2. 數(shù)字簽名:私鑰數(shù)字簽名,公鑰驗(yàn)證。

可學(xué)習(xí)的網(wǎng)址

RSA原理:這個(gè)網(wǎng)址講得詳細(xì),可參考學(xué)習(xí)
crypto++官網(wǎng)中RSA的相關(guān)代碼:RSA Cryptography
這個(gè)博主寫的代碼很詳細(xì):RSA封裝代碼學(xué)習(xí)

二、代碼部分

1.visual studio編程注意

在visual studio中,僅支持一個(gè)main函數(shù),所以使用多個(gè)完整的cpp結(jié)構(gòu)編寫源代碼將無法正確運(yùn)行。
正確做法:封裝。編寫一個(gè)主函數(shù)main。cpp,使用多個(gè)頭文件xxx.h編寫頭文件和函數(shù)聲明部分,使用多個(gè)xxx.cpp編寫函數(shù)定義部分,在main.cpp中集中調(diào)用。

一個(gè)標(biāo)準(zhǔn)案例提供給大家

如何在VisualStdio中運(yùn)行一個(gè)包含多個(gè)源文件的程序

2.RSA密鑰生成

void GenerateKeys(AutoSeededRandomPool rng, InvertibleRSAFunction parameters) {
	
	parameters.GenerateRandomWithKeySize(rng, 1024);

	RSA::PrivateKey privateKey(parameters);
	RSA::PublicKey publicKey(parameters);
}

思考:

此處使用void作為函數(shù)返回值是不對(duì)的,因?yàn)槲覀円a(chǎn)生一對(duì)公私鑰密鑰對(duì)。所以我們應(yīng)該使用什么來接收結(jié)果(公鑰,私鑰)?

需要構(gòu)造結(jié)構(gòu)體!

struct key
{
	RSA::PrivateKey private_key;
	RSA::PublicKey public_key;
};

MyRSA.h

struct key
{
	RSA::PrivateKey private_key;
	RSA::PublicKey public_key;
};

key generate_key(unsigned int key_size = 2048);

RSA.cpp

#include "MyRSA.h"

/**
 * \brief 生成密鑰對(duì)
 * \param key_size
 * \return
 */
key generate_key(const unsigned int key_size)	//鑰匙的長(zhǎng)度,通常是2048以上,越大相對(duì)越安全,但相對(duì)的運(yùn)算越久
{
	AutoSeededRandomPool rng;	//偽隨機(jī)數(shù)
	InvertibleRSAFunction params;
	params.GenerateRandomWithKeySize(rng, key_size);
	key keys;
	keys.private_key = params;
	keys.public_key = params;	//根據(jù)這個(gè)參數(shù)產(chǎn)生配對(duì)的公鑰、密鑰并返回這個(gè)集合

	return keys;
}

3.關(guān)于RSA的五個(gè)基本函數(shù)

  • 生成密鑰對(duì)
  • 加密
  • 解密
  • 私鑰簽名
  • 公鑰驗(yàn)證簽名

完整代碼如下:

initializeCrypto.h

/*
 *
 *  Created on: 2023-8-28
 *      Author: Chen Jingyan
 */

#include "cryptlib.h"
using namespace CryptoPP;


MyRSA.h

#ifndef CRYPTO_RSA_H
#define CRYPTO_RSA_H

#include"initializeCrypto.h"
#include "pssr.h"
#include "rsa.h"
#include "osrng.h"

struct key
{
	RSA::PrivateKey private_key;
	RSA::PublicKey public_key;
};

key generate_key(unsigned int key_size = 2048);

bool rsa_encrypt(const std::string& plain, RSA::PublicKey& public_key, std::string& cipher);

bool rsa_decrypt(const std::string& cipher, RSA::PrivateKey& private_key, std::string& recovered);

bool rsa_signature(const std::string& plain, RSA::PrivateKey& private_key, std::string& signature);

bool rsa_verify(const std::string& cipher_sign, RSA::PublicKey& public_key, std::string& recovered);

#endif

RSA.CPP

#include "MyRSA.h"

/**
 * \brief 生成密鑰對(duì)
 * \param key_size
 * \return
 */
key generate_key(const unsigned int key_size)	//鑰匙的長(zhǎng)度,通常是2048以上,越大相對(duì)越安全,但相對(duì)的運(yùn)算越久
{
	AutoSeededRandomPool rng;	//偽隨機(jī)數(shù)
	InvertibleRSAFunction params;
	params.GenerateRandomWithKeySize(rng, key_size);
	key keys;
	keys.private_key = params;
	keys.public_key = params;	//根據(jù)這個(gè)參數(shù)產(chǎn)生配對(duì)的公鑰、密鑰并返回這個(gè)集合

	return keys;
}

/**
 * \brief RSA加密(OAEP方案) 最佳非對(duì)稱加密填充(OAEP)
 * \param plain 待加密原文
 * \param public_key 公鑰
 * \param cipher 密文
 * \return 加密成功或失敗
 */
bool rsa_encrypt(const std::string& plain,  RSA::PublicKey& public_key, std::string& cipher)
{
	try
	{
		 AutoSeededRandomPool rng;
		const  RSAES_OAEP_SHA_Encryptor encrypt(public_key);
		 StringSource ss_1(plain, true, new  PK_EncryptorFilter(rng, encrypt, new  StringSink(cipher)));
	}
	catch (...)
	{
		return false;
	}

	return true;
}

/**
 * \brief RSA解密(OAEP方案)
 * \param cipher 密文
 * \param private_key 密鑰
 * \param recovered 恢復(fù)的原文
 * \return 恢復(fù)成功或失敗
 */
bool rsa_decrypt(const std::string& cipher,  RSA::PrivateKey& private_key, std::string& recovered)
{
	try
	{
		 AutoSeededRandomPool rng;
		const RSAES_OAEP_SHA_Decryptor decrypt(private_key);
		 StringSource ss_2(cipher, true, new  PK_DecryptorFilter(rng, decrypt, new  StringSink(recovered)));
	}
	catch (...)
	{
		return false;
	}
	return true;
}

/**
 * \brief:簽名
 * \param plain
 * \param private_key
 * \param signature
 * \return
 */
bool rsa_signature(const std::string& plain,  RSA::PrivateKey& private_key, std::string& signature)
{
	try
	{
		 AutoSeededRandomPool rng;
		const  RSASS< PSS,  SHA256>::Signer signer(private_key);
		 StringSource ss_1(plain, true, new  SignerFilter(rng, signer, new  StringSink(signature)));
	}
	catch (...)
	{
		return false;
	}
	return true;
}

/**
 * \brief:公鑰驗(yàn)證簽名
 * \param cipher_sign
 * \param public_key
 * \param recovered
 * \return true/faluse
 */
bool rsa_verify(const std::string& cipher_sign,  RSA::PublicKey& public_key, std::string& recovered)
{
	try
	{
		const  RSASS< PSS,  SHA256>::Verifier verifier(public_key);
		 StringSource ss_2(cipher_sign, true,
			new  SignatureVerificationFilter(verifier,
				new  StringSink(recovered),  SignatureVerificationFilter::THROW_EXCEPTION |  SignatureVerificationFilter::PUT_MESSAGE));
	}
	catch (...)
	{
		return false;
	}
	return true;
}



main.cpp

#include "timeSpan.h"
#include"MyRsa.h"
#include <iostream>
#include <iomanip>
using namespace std;

int main() {
/*RSA加密*/
	
	key keys = generate_key();

	const string plain = "HelloWorld";
	string cipher, recovered;

	if (rsa_encrypt(plain, keys.public_key, cipher))
	{
		if (rsa_decrypt(cipher, keys.private_key, recovered))
		{
			cout << "Cipher: " << endl;
			for (const auto& x : cipher)
			{
				cout
					<< setfill('0')
					<< setw(2)
					<< setiosflags(ios::uppercase)
					<< hex << static_cast<unsigned int>(static_cast<unsigned char>(x))
					<< " ";
			}
			cout << "Recovered message: " << recovered << endl;
		}
	}
return 0;
}

VS 使用技巧總結(jié)

1. VS修改每次新建源文件或頭文件時(shí)將自動(dòng)添加寫好的注釋內(nèi)容.

步驟:文章來源地址http://www.zghlxwxcb.cn/news/detail-679494.html

  1. 根據(jù)下面地址找到文件newc++file.cpp
    D:\visual studio\Common7\IDE\VC\VCProjectItems\newc++file.cpp
  2. 將其復(fù)制到桌面,然后用記事本方式打開;
  3. 修改注釋內(nèi)容,下面給一個(gè)例子:
/*
 *  file name:
 *
 *  Created on: 2023--
 *      Author: 宇宙修理員
 */
  1. 保存后,將桌面文件復(fù)制回去步驟1的地址中,將原來文件覆蓋。

2. 一次性修改所有相關(guān)命令

  1. 選定要修改的命令,ctrl+H,出現(xiàn)下面這個(gè)搜索框
    【crypto++使用】使用crypto++庫(kù)函數(shù)運(yùn)行RSA非對(duì)稱加密,密碼學(xué),密碼學(xué)
  2. 輸入空格,點(diǎn)擊“全部替換”圖標(biāo)。

到了這里,關(guān)于【crypto++使用】使用crypto++庫(kù)函數(shù)運(yùn)行RSA非對(duì)稱加密的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 密碼學(xué)之對(duì)稱加密體系(2):AES、SM4的 S 盒具體算法的實(shí)現(xiàn)

    ??點(diǎn)擊進(jìn)入【硬件安全】社區(qū),查看更多精彩內(nèi)容?? ??點(diǎn)擊查看《硬件安全》系列文章?? ??? 聲明 : ?? 作者主頁(yè):【擺渡滄桑的CSDN主頁(yè)】。 ?? 未經(jīng)作者允許,禁止轉(zhuǎn)載。 ?? 本文為非盈利性質(zhì),目的為個(gè)人學(xué)習(xí)記錄及知識(shí)分享。因能力受限,存在知識(shí)點(diǎn)分析不

    2024年02月16日
    瀏覽(106)
  • AES(對(duì)稱加密)和RSA(非對(duì)稱加密)使用詳情

    ? ? ??待加密的明文以16字節(jié)分組進(jìn)行加密,如果數(shù)據(jù)字節(jié)長(zhǎng)度不是16的倍數(shù),最后的一組則需要在有效數(shù)據(jù)后面進(jìn)行填充,使得數(shù)據(jù)長(zhǎng)度變?yōu)?6字節(jié),AES填充方式分為NoPadding、PKCS5(PKCS7)、ISO10126、Zeros。 NoPadding :不填充,那就只能加密長(zhǎng)度為16倍數(shù)的數(shù)據(jù),一般不使用; Zero

    2024年02月08日
    瀏覽(16)
  • 【RSA加密/解密】PKCS1_OAEP和PKCS1_v1_5兩種填充方案【python RSA密鑰對(duì)生成、密碼加密、密文解密、pycharm安裝Crypto】

    一、PKCS1_OAEP和PKCS1_v1_5是公鑰加密標(biāo)準(zhǔn)中的兩種填充方案。 PKCS1_OAEP(Optimal Asymmetric Encryption Padding)是一種更安全的填充方案,它提供了更好的安全性和抗攻擊性。它使用隨機(jī)數(shù)進(jìn)行填充,并引入了哈希函數(shù)來增加安全性。 PKCS1_v1_5是較舊的填充方案,它使用固定的填充字節(jié)序

    2024年02月06日
    瀏覽(63)
  • JS使用RSA非對(duì)稱加密方式加密傳輸數(shù)據(jù)

    場(chǎng)景:出于安全考慮,要求對(duì)頁(yè)面提交的關(guān)鍵信息進(jìn)行加密,在網(wǎng)絡(luò)傳輸過程中使用密文傳遞,在服務(wù)器端解密后使用。這樣不管在瀏覽器端還是網(wǎng)絡(luò)傳輸中截獲了數(shù)據(jù),都無法獲取實(shí)際的信息。 方法:使用非對(duì)稱加密算法,在前端頁(yè)面使用公鑰進(jìn)行加密,在后端服務(wù)使用密

    2023年04月08日
    瀏覽(22)
  • 使用非對(duì)稱加密(RSA) 實(shí)現(xiàn)前端加密后端解密

    使用非對(duì)稱加密(RSA) 實(shí)現(xiàn)前端加密后端解密

    數(shù)據(jù)加密方式有: 單向加密、對(duì)稱加密、非對(duì)稱加密、加密鹽、散列函數(shù)、數(shù)字簽名。 1、單向加密 單向加密通過對(duì)數(shù)據(jù)進(jìn)行摘要計(jì)算生成密文,密文不可逆推還原。只能加密,不能解密,常用于提取數(shù)據(jù)的指紋信息以此來驗(yàn)證數(shù)據(jù)的完整性。但是會(huì)引發(fā)雪崩效應(yīng)(雪崩效應(yīng)

    2024年02月08日
    瀏覽(95)
  • 密碼學(xué)概念科普(加密算法、數(shù)字簽名、散列函數(shù)、HMAC)

    密碼散列函數(shù) (Cryptographic hash function),是一個(gè)單向函數(shù),輸入消息,輸出摘要。主要特點(diǎn)是: 只能根據(jù)消息計(jì)算摘要,很難根據(jù)摘要反推消息 改變消息,摘要一定會(huì)跟著改變 對(duì)于不同的消息,計(jì)算出的摘要幾乎不可能相同 根據(jù)散列函數(shù)的上述特點(diǎn),可以應(yīng)用在保存密碼、數(shù)

    2024年02月10日
    瀏覽(54)
  • Python(30):非對(duì)稱加密算法RSA的使用(openssl生成RSA公私鑰對(duì))

    Python(30):非對(duì)稱加密算法RSA的使用(openssl生成RSA公私鑰對(duì))

    1.1、生成RSA公私鑰對(duì)命令 1.2、公鑰 -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCfNHu9aoeNUTAZH3GCP2CQaSOg XNx0tImsIaCWBEQK3/fvUx8f17hIOtttCMrrTPWefUdcUxLIZ+xzqeU/eISsz9Ym kguImd1+bMkGIYiHBKmF5Uww2jGSU738c+AUuRKpixZP+VPekLY+KbOH7NkE2U/L XGbDeMXeiqQ22UmOSQIDAQAB -----END PUBLIC KEY----- 1.3、私鑰 -----BEGIN RSA PRIVATE KEY--

    2024年02月03日
    瀏覽(24)
  • CRYPTO 密碼學(xué)-筆記

    CRYPTO 密碼學(xué)-筆記

    ? ? ? ? 替換法的加密方式:一種是單表替換,另一種是多表替換 ? ? ? ? 單表替換:原文和密文使用同一張表 ? ? ? ? abcde---》sfdgh ? ? ? ? 多表替換:有多漲表,原文和密文進(jìn)行對(duì)比 ? ? ? ? 表單1:abcde---》sfdgh? 表單2:abcde---》chfhk? ?表單3:abcde---》jftou ? ? ? ?原文

    2024年02月12日
    瀏覽(17)
  • CTF CRYPTO 密碼學(xué)-1

    CTF CRYPTO 密碼學(xué)-1

    工具簡(jiǎn)介 在Kali Linux系統(tǒng)中,openssl 是一個(gè)強(qiáng)大的命令行工具,用于處理SSL/TLS協(xié)議。openssl pkeyutl 是 openssl 工具集中的一個(gè)命令,用于處理私鑰文件。 參數(shù)解釋 openssl pkeyutl:這是執(zhí)行私鑰操作的命令。 -decrypt:這個(gè)選項(xiàng)告訴 openssl 執(zhí)行解密操作。 -inkey d.dec:指定用于解密的私

    2024年01月18日
    瀏覽(89)
  • CTF CRYPTO 密碼學(xué)-4

    CTF CRYPTO 密碼學(xué)-4

    描述:oss先生將三個(gè)培根的中間一只移到了左邊,然后咬了一小口最后一根,說真好吃,真是個(gè)奇怪的先生! 密文:VlM5WnlXc0ZibEhmMmE1ZHYxMDlhVkdmMlk5WmtRPT0= 分析 應(yīng)該是根據(jù)題目提示解出壓縮包的密碼,查看flag。 第一次: 第二次: 分析 發(fā)現(xiàn)第二次解密失敗,查看題目描述。三只培

    2024年01月19日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包