后端签名,前端解签,或者前端加签,后端解签。后端事先生成公钥和私钥,公钥发给前端页面,私钥后端自己保留。非对称加密算法常用RSA算法,签文使用base64编码成字符串,后端UE4使用Crypto++库,前端使用JSEncrypt.js或者jsrsasign.js进行RSA的对应操作。经过测试,本例中的前后端代码的加签解签计算结果是一致的。

提示:以下是本篇文章正文内容,下面案例可供参考

前端html分别使用JSEncrypt库和jsrsasign库写两个函数,一个是加签函数,使用私钥加签字符串并将签文发送到后端进行解签。另一个是解签函数,需要接收后端发来的签文,并使用公钥验证签文。

<script src="./crypto-js.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/jsencrypt/3.2.1/jsencrypt.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/jsrsasign/10.5.13/jsrsasign-all-min.min.js"></script>
<script type = "text/javascript">
    function RsaSign(plainText){
        var signStr = new JSEncrypt();
		//设置私钥
        // signStr.setPrivateKey('-----BEGIN RSA PRIVATE KEY-----'+privKey+'-----END RSA PRIVATE KEY-----');
        signStr.setPrivateKey(privKey)
        //用私钥给明文加签,例子中使用SHA1算法,其它算法也可,如:SHA256
		// var signature = signStr.sign(plainText, CryptoJS.SHA256, "sha256");
        var signature = signStr.sign(plainText, CryptoJS.SHA1, "sha1"); //和后端使用一样的散列算法
        return signature;
    function RsaVerify(plainText, signature){
        var verify = new JSEncrypt();
		//设置公钥
        // verify.setPublicKey('-----BEGIN PUBLIC KEY-----' + pubKey + '-----END PUBLIC KEY-----');
        verify.setPublicKey(pubKey)
        //验证方法有三个参数明文,用私钥加签后的字符串,加签的算法(跟上文保持一致哈~)
		var verified = verify.verify(plainText, signature, CryptoJS.SHA1);  //和后端使用一样的散列算法
        return verified;
    function RsaSign_jsrsasign(plainText){
        // 创建 Signature 对象
        let signature=new KJUR.crypto.Signature({alg:"SHA1withRSA",prvkeypem:privKey});    //!这里指定 私钥 pem!
        signature.updateString(plainText);
        let a = signature.sign();
        let sign = hextob64(a);
        return sign
    function RsaVerify_jsrsasign(plainText, signature){
        // !要重新new 一个Signature, 否则, 取摘要和签名时取得摘要不一样, 导致验签误报失败(原因不明)!
        let signatureVf = new KJUR.crypto.Signature({alg:"SHA1withRSA",prvkeypem:pubKey});
        signatureVf.updateString(plainText);
        // !接受的参数是16进制字符串!
        let b = signatureVf.verify(b64tohex(signature));
        return b;
</script>

后端UE4写三个函数,一个是生成公私密钥函数。一个是加签函数,使用私钥加签字符串并将签文发送到前端进行解签。另一个是解签函数,需要接收前端发来的签文,并使用公钥验证签文。
以下为实现逻辑:

1. C++代码

RSALibrary.h

#pragma once
#include <string>
using namespace std;
#include "../../../ThirdParty/crypto/include/Win64/osrng.h"
#include "../../../ThirdParty/crypto/include/Win64/aes.h"
#include "../../../ThirdParty/crypto/include/Win64/hex.h"
#include "../../../ThirdParty/crypto/include/Win64/files.h"
#include "../../../ThirdParty/crypto/include/Win64/rsa.h"
#include "../../../ThirdParty/crypto/include/Win64/base64.h"
using namespace CryptoPP;
#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "RSALibrary.generated.h"
UCLASS()
class H_CRYPTO860_PLUGIN_API URSALibrary : public UBlueprintFunctionLibrary
	GENERATED_BODY()
public:
	//生成RSA公钥和私钥
	UFUNCTION(BlueprintCallable, meta = (DisplayName = "GenerateRSAKey_ue4", Wordkeys = "GenerateRSAKey_ue4"), Category= "RSA")
	static bool GenerateRSAKey_ue4(int keyLength, FString privFilename, FString pubFilename);
	//RSA使用私钥签名
	UFUNCTION(BlueprintCallable, meta = (DisplayName = "RsaSignString", Wordkeys = "RsaSignString"), Category= "RSA")
    static FString RsaSignString(FString privFilename, FString tobeSignString);
	//RSA使用公钥验证
	UFUNCTION(BlueprintCallable, meta = (DisplayName = "RsaVerString", Wordkeys = "RsaVerString"), Category= "RSA")
    static bool RsaVerString(FString pubFilename, FString tobeSignString, FString signedString);
private:
	//随机种子
	static AutoSeededRandomPool & getRng();

RSALibrary.cpp

#include "RSALibrary.h"
#include "assert.h"
//生成公私密钥
bool URSALibrary::GenerateRSAKey_ue4(int keyLength, FString privFilename, FString pubFilename)
	bool isGenerate = true;
		RSAES_PKCS1v15_Decryptor priv(getRng(), keyLength);
		Base64Encoder privFile(new FileSink(TCHAR_TO_ANSI(*privFilename)));	//生成base64格式密文
		priv.AccessMaterial().Save(privFile);
		privFile.MessageEnd();
		RSAES_PKCS1v15_Encryptor pub(priv);
		Base64Encoder pubFile(new FileSink(TCHAR_TO_ANSI(*pubFilename)));	//生成base64格式密文
		pub.AccessMaterial().Save(pubFile);
		pubFile.MessageEnd();
	catch (CryptoPP::Exception& e) {
		isGenerate = false;
    	cout << "RSALibrary::GenerateRSAKey_ue4 Error: " << e.what() << endl;
	return  isGenerate;
FString URSALibrary::RsaSignString(FString privFilename, FString tobeSignString)
	const char* fileName = TCHAR_TO_ANSI(*privFilename);
	FileSource priFile(fileName, true, new Base64Decoder);	//使用base64格式密钥
	RSASSA_PKCS1v15_SHA_Signer privkey(priFile);
	string signedString;	//签名后的文本
	StringSource(TCHAR_TO_UTF8(*tobeSignString), true, new SignerFilter(getRng(), privkey, new Base64Encoder(new StringSink(signedString))));//使用base64格式密文
	return UTF8_TO_TCHAR(signedString.c_str());
//验证签名
bool URSALibrary::RsaVerString(FString pubFilename, FString tobeSignString, FString signedString)
	const char* fileName = TCHAR_TO_ANSI(*pubFilename);	
	FileSource pubFile(fileName, true, new Base64Decoder);	//使用base64格式密钥
	RSASSA_PKCS1v15_SHA_Verifier pubkey(pubFile);
	StringSource signatureString(TCHAR_TO_UTF8(*signedString), true, new Base64Decoder);	//使用base64格式密文
	if (signatureString.MaxRetrievable() != pubkey.SignatureLength())
		return false;
	SecByteBlock signature(pubkey.SignatureLength());
	signatureString.Get(signature, signature.size());
	SignatureVerificationFilter *verifierFilter = new SignatureVerificationFilter(pubkey);
	verifierFilter->Put(signature, pubkey.SignatureLength());
	StringSource(TCHAR_TO_UTF8(*tobeSignString), true, verifierFilter);
	return verifierFilter->GetLastResult();
//自动生成随机种子
AutoSeededRandomPool & URSALibrary::getRng()
	static AutoSeededRandomPool m_Rng;
	return m_Rng;

2. 蓝图

在这里插入图片描述
后端UE4自己实现签名和验签
在这里插入图片描述
UE4签名后,将签文发给前端进行验签
在这里插入图片描述
UE4接收前端发来的签文,进行验签。

将html页面加载到UE4中,运行效果如下:

  1. 后端UE4加签,前端html分别使用JSEncrypt库和jsrsasign库解签
    在这里插入图片描述
    在这里插入图片描述

  2. 前端html分别使用JSEncrypt库和jsrsasign库加签,后端UE4解签

			case 'JSEncrypt签名':
                textStr = RsaSign(content);
                console.log(textStr);
                window.ue4("Decoder",{"Type":"RSA_Sign","content":textStr});
                deStr = RsaVerify(content, textStr);
                // deStr = RsaVerify_jsrsasign(content, textStr);
                console.log(deStr);
                break;
            case 'jsrsasign签名':
                textStr = RsaSign_jsrsasign(content);
                console.log(textStr);
                window.ue4("Decoder",{"Type":"RSA_Sign","content":textStr});
                deStr = RsaVerify_jsrsasign(content, textStr);
                // deStr = RsaVerify(content, textStr);
                console.log(deStr);
                break;

前端签名
在这里插入图片描述完美实现前后端加解签。

一般情况下,前端自己实现加解签没有问题,后端自己实现加解签也没有问题。问题主要出在2个方面:

  1. 前后端编码格式不一样
    前端加签的结果传到后端,或者后端加签的结果传到前端,对方无法识别接收到的字符串。主要原因在于双方的字符串编码格式不一样,前端的是base64格式,后端的就不能是hex格式,需要使用同样的编码格式。
  2. 散列算法不一样
    因为后端使用SHA散列算法,这是默认的SHA1算法,所以前端也要使用SHA1算法。
  3. 密钥格式不一样
    后端Crypto++库生成的是key格式的密钥,前端jsrsasign库使用的是pem格式的密钥(JSEncrypt库可以兼容两种格式),所以需要将key格式转换为pem格式,转换请参考:
    RSA公钥私钥生成pem文件

前端开源项目 CDN 加速服务网站
前端RSA加密、解密、签名、验签。本文包含jsencrypt和jsrsasign两种方法教程
jsrsasign使用笔记(加密,解密,签名,验签)
JavaScript怎么做RSA加密解密, 签名和验签? 有没有好用的库?
RSA PKCS1 填充方式
Crypto++库实现AES和RSA加密解密
基于Crypto++/Cryptopp的rsa密钥生成,rsa加密、解密,rsa签名、验签
Crypto++使用
利用Crypto++实现RSA加密算法

UE4中Crypto++库加密解密第五节:RSA签名解签 - 前端JSEncrypt库、jsrsasign库和后端UE4使用Crypto++互相加解签文章目录UE4中Crypto++库加密解密前言一、前端二、后端1. C++代码2. 蓝图测试结果总结前言后端签名,前端解签,或者前端加签,后端解签。后端事先生成公钥和私钥,公钥发给前端页面,私钥后端自己保留。非对称加密算法常用RSA算法,签文使用base64编码成字符串,后端UE4使用Crypto++库,前端使用jsencrypt.js或者jsrs
为了防止Web页面的敏感信息泄露,我们需要使用RSA加密算法对数据进行加密。 JS中常用的RSA加密有:jsencryptjsrsasign,js-crypto-rsa jsencrypt使用比较简单: npm i jsencrypt import JSEncrypt from ‘jsencrypt‘ var publicKey = "-----BEGIN PUBLIC ...
UE4Crypto++加密解密 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 第一节:RSA加密解密 - 前端JSEncrypt后端UE4使用Crypto++互相加解密 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录UE4Crypto++加密解密前言一、前端二、后端1. C++代码2. 蓝图测试结果总结 登录系统时,用户的密码用明文传输,太不安全,应该加密传输,怎么做呢,对称加密一旦秘钥丢失则形同虚设,最好使用非对称加密的方式,由后端事先生
RSA概述 1978年出现了著名的RSA算法,它通常是先生成一对RSA密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册。为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。 RSA允许你选择公钥的大小。512位的密钥被视为不安全的;768位的密钥不用担心受到除了国家安全管理(NSA)外的其他事物的危害;1024位的密钥几乎是安全的。RSA在一些主要产品内部都有嵌入,像 Windows、网景 Navigator、 Quicken和 Lotus Not
jsrsasignjsrsasign”(RSA-Sign JavaScript)是一个免费的开源加密,支持RSA / RSAPSS / ECDSA / DSA签名/验证,ASN.1,PKCS#1/5/8私钥/公钥,X.509证书,纯JavaScript中的CRL,OCSP,CMS SignedData,TimeStamp,CAdES JSON Web签名/令牌/密钥。 公开页面是 。 我们始终欢迎您的错误修正和请求请求贡献:) 2020年10月5日:jsrsasign赢得了 。 谢谢Google。 2020年9月23日:发布了与CMS SignedData相关的类的10.0.0,包括时间戳和CAdES体系结构更新 2020年8月24日:发布到新的CRL API的9.1.0与证书保持一致 2020年8月19日:发布9.0.0版,用于证书和CSR生成和解析的主要更新,而
对于数字签名的设计与实现,我们通常采用基于md5 rsa算法的方案。首先,我们需要了解什么是md5和rsa算法。 MD5(信息摘要算法)是一种常用的密码散列函数,能够把任意长度的信息转换成128位的摘要,且通常不可逆,所以 md5的数据处理是单向的。RSA是一种公钥加密算法,也是目前被广泛应用的加密算法之一,RSA算法利用了大数分解的难度来实现密码学中的签名加解密等。 基于这两种算法,数字签名的设计和实现我们可以分为以下几个步骤: 1. 生成密钥对。我们需要生成一对RSA算法的公钥和私钥,同时生成一个用于MD5算法的消息摘要。 2. 信息摘要。使用MD5算法,对待签名的信息进行摘要,得到一个唯一的128位散列值。 3. 签名使用私钥对摘要进行加密,生成签名。 4. 验证签名使用公钥和与原文相同的MD5算法,对签名进行解密,然后将解密后的摘要与原文的摘要进行对比,以确定签名是否有效。 总体来说,基于md5 rsa的数字签名能够有效地实现信息的完整性、不可抵赖性等安全特性,可以用于各种数据安全需要的场合。当然了,在实际应用中,我们还需要注意一些细节问题,比如如何合理地选择密钥长度、如何保护密钥等等。
彩色电暖: 我遇到过,初次执行gclient命令, depot_tools 在进行更新时提示"Updating depot_tools..." 然后提示 系统找不到文件 xxx\depot_tools\python3_bin_reldir.txt。 '"\python3.exe"' 不是内部或外部命令,也不是可运行的程序 命令执行完毕,python3_bin_reldir.txt 文件就自动创建了, 所以,猜测这是因为初次运行时,还没有在depot_tools目录下安装python , 然后它会自动安装 RSA加解密 - 前端JSEncrypt和后端UE4使用Crypto++互相加解密 joeysnow: 大神,有GITHUB吗,搞几天了表情包 RSA加解密 - 前端JSEncrypt和后端UE4使用Crypto++互相加解密 joeysnow: 库哪里下载的呀,我网上找的库一直编译报错表情包 UE4.26调用CryptoPP8.6库实现加密解密 weixin_45177891: 大佬可以分享一下项目文件学习一下麻 AES加密解密 - 前端crypto-js.min.js和后端UE4使用Crypto++互相加解密 打磨的石头: 1.如果要更改填充方式就改成这样: [code=javascript] case "AES": cipherStr = CryptoJS.AES.encrypt(srcs, aesKey, { mode: CryptoJS.mode.ECB, // padding: CryptoJS.pad.ZeroPadding padding: CryptoJS.pad.NoPadding //此处改为:NoPadding }).toString(); [/code] 2.GCM是什么意思?