Go语言实现SHA256生成散列值

Go语言实现SHA256生成散列值


SHA256是一种常用的单向散列函数(哈希函数),能够生成256比特的散列值.

实现代码如下:

import (
	"crypto/sha256"
	"encoding/hex"
	"fmt"
)

//SHA256生成哈希值
func GetSHA256HashCode(message []byte)string{
	//方法一:
	//创建一个基于SHA256算法的hash.Hash接口的对象
	hash := sha256.New()
	//输入数据
	hash.Write(message)
	//计算哈希值
	bytes := hash.Sum(nil)
	//将字符串编码为16进制格式,返回字符串
	hashCode := hex.EncodeToString(bytes)
	//返回哈希值
	return hashCode
	
	//方法二:
	//bytes2:=sha256.Sum256(message)//计算哈希值,返回一个长度为32的数组
	//hashcode2:=hex.EncodeToString(bytes2[:])//将数组转换成切片,转换成16进制,返回字符串
	//return hashcode2
}

测试代码如下:

func main(){
	message:=[]byte("hello world")
	hashCode:=GetSHA256HashCode(message)
	fmt.Println(hashCode)
}

测试结果如下:
SHA256测试结果

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是基于OpenSSL库的C++代码实现: ```cpp #include <openssl/rsa.h> #include <openssl/sha.h> #include <openssl/bio.h> #include <openssl/pem.h> void generateRSAKeyPair(char* publicKey, char* privateKey) { RSA *rsa = RSA_new(); BIGNUM *bn = BN_new(); SHA256_CTX sha256; unsigned char hash[SHA256_DIGEST_LENGTH]; char hexHash[SHA256_DIGEST_LENGTH * 2 + 1]; BIO *bio = NULL; int ret; // 生成RSA密钥对 BN_set_word(bn, RSA_F4); RSA_generate_key_ex(rsa, 2048, bn, NULL); BN_free(bn); // 生成公钥PEM文件 bio = BIO_new(BIO_s_mem()); ret = PEM_write_bio_RSAPublicKey(bio, rsa); if (ret != 1) { printf("Error: Failed to write public key!\n"); RSA_free(rsa); BIO_free(bio); return; } ret = BIO_flush(bio); if (ret != 1) { printf("Error: Failed to flush BIO!\n"); RSA_free(rsa); BIO_free(bio); return; } ret = BIO_get_mem_data(bio, &publicKey); if (ret <= 0) { printf("Error: Failed to get public key data from BIO!\n"); RSA_free(rsa); BIO_free(bio); return; } publicKey[ret] = '\0'; BIO_free(bio); // 生成私钥PEM文件 bio = BIO_new(BIO_s_mem()); ret = PEM_write_bio_RSAPrivateKey(bio, rsa, NULL, NULL, 0, NULL, NULL); if (ret != 1) { printf("Error: Failed to write private key!\n"); RSA_free(rsa); BIO_free(bio); return; } ret = BIO_flush(bio); if (ret != 1) { printf("Error: Failed to flush BIO!\n"); RSA_free(rsa); BIO_free(bio); return; } ret = BIO_get_mem_data(bio, &privateKey); if (ret <= 0) { printf("Error: Failed to get private key data from BIO!\n"); RSA_free(rsa); BIO_free(bio); return; } privateKey[ret] = '\0'; BIO_free(bio); // 计算公钥SHA256哈希 SHA256_Init(&sha256); ret = i2d_RSAPublicKey(rsa, NULL); if (ret <= 0) { printf("Error: Failed to get public key data length!\n"); RSA_free(rsa); return; } unsigned char *publicKeyData = (unsigned char *)malloc(ret); ret = i2d_RSAPublicKey(rsa, &publicKeyData); if (ret <= 0) { printf("Error: Failed to get public key data!\n"); RSA_free(rsa); free(publicKeyData); return; } SHA256_Update(&sha256, publicKeyData, ret); free(publicKeyData); SHA256_Final(hash, &sha256); // 将SHA256哈希转换为十六进制字符串 for (int i = 0; i < SHA256_DIGEST_LENGTH; i++) { sprintf(hexHash + i * 2, "%02x", hash[i]); } hexHash[SHA256_DIGEST_LENGTH * 2] = '\0'; printf("Public Key:\n%s\n", publicKey); printf("Private Key:\n%s\n", privateKey); printf("Public Key SHA256 Hash:\n%s\n", hexHash); RSA_free(rsa); } ``` 其中,`generateRSAKeyPair`函数接受两个`char`类型的指针参数,用于返回生成的公钥和私钥PEM文件内容。该函数实现了以下操作: 1. 生成2048位RSA密钥对; 2. 将公钥PEM文件内容写入内存`BIO`中,并获其数据; 3. 将私钥PEM文件内容写入内存`BIO`中,并获其数据; 4. 计算公钥的SHA256哈希,并将其转换为十六进制字符串; 5. 打印公钥、私钥和SHA256哈希。 需要注意的是,该实现使用了OpenSSL库中的函数,因此需要在编译时链接OpenSSL库。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值