Kotlin实现SHA-256哈希和RSA签名

1. 对一段原始字符串,实现SHA 哈希签名,即hashMessage;

2. 用私钥key 对SHA后的字符串信息签名,即signatureMessage;

3. 用公钥key验证私钥签名的信息(私钥签名的原始字符串是SHA-256哈希的字符串,即hashMessage)是否正确;

import java.security.MessageDigest
import java.security.KeyFactory
import java.security.PrivateKey
import java.security.PublicKey
import java.security.Signature
import java.security.spec.PKCS8EncodedKeySpec
import java.security.spec.X509EncodedKeySpec
import org.bouncycastle.util.encoders.Hex

// 对原始字符串传SHA-256哈希
fun sha256(input: String): String {
    val bytes = input.toByteArray()
    val md = MessageDigest.getInstance("SHA-256")
    val digest = md.digest(bytes)
    return Hex.toHexString(digest)
}

// 加载私钥信息
fun loadPrivateKey(privateKeyPEM: String): PrivateKey {
    val privateKeyPEMStripped = privateKeyPEM
        .replace("-----BEGIN PRIVATE KEY-----", "")
        .replace("-----END PRIVATE KEY-----", "")
        .replace("\n", "")
    val encoded = Hex.decode(privateKeyPEMStripped)
    val keySpec = PKCS8EncodedKeySpec(encoded)
    val keyFactory = KeyFactory.getInstance("RSA")
    return keyFactory.generatePrivate(keySpec)
}

// 加载公钥信息
fun loadPublicKey(publicKeyPEM: String): PublicKey {
    val publicKeyPEMStripped = publicKeyPEM
        .replace("-----BEGIN PUBLIC KEY-----", "")
        .replace("-----END PUBLIC KEY-----", "")
        .replace("\n", "")
    val encoded = Hex.decode(publicKeyPEMStripped)
    val keySpec = X509EncodedKeySpec(encoded)
    val keyFactory = KeyFactory.getInstance("RSA")
    return keyFactory.generatePublic(keySpec)
}

// 使用私钥key 对SHA-256哈希后的字符串签名
fun signMessage(message: String, privateKey: PrivateKey): String {
    val signature = Signature.getInstance("SHA256withRSA")
    signature.initSign(privateKey)
    signature.update(message.toByteArray())
    val signedBytes = signature.sign()
    return Hex.toHexString(signedBytes)
}

//使用公钥钥key 对私钥签名的SHA-256哈希的字符串 验证:message 是对原始字符串 SHA-256哈希后的字符串; signedMessage 是私钥签名后的字符串;publicKey - 公钥key
fun verifySignature(message: String, signedMessage: String, publicKey: PublicKey): Boolean {
    val signature = Signature.getInstance("SHA256withRSA")
    signature.initVerify(publicKey)
    signature.update(message.toByteArray())
    val signedBytes = Hex.decode(signedMessage)
    return signature.verify(signedBytes)
}

//示例如下

fun main() {
    val message = "Test"
    val privateKeyPEM = ""

     val publicKeyPEM = ""
     val hashMsg = sha256(message)

     // 加载私钥和公钥
    val privateKey = loadPrivateKey(privateKeyPEM)
    val publicKey = loadPublicKey(publicKeyPEM)

    // 使用私钥签名
    val signatureMessage = signMessage(hashMsg, privateKey)

    // 使用公钥验证签名信息
    val isVerified = verifySignature(hashMsg, signatureMessage, publicKey)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/873320.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GitHub介绍

GitHub 是一个基于 Git 的在线代码托管平台,用于版本控制和协作。下面是一些常用的 Git 命令,这些命令可以帮助你在本地和 GitHub 之间管理和同步代码仓库: 初始化和配置 初始化本地仓库 git init这将在当前目录下创建一个新的 Git 仓库。 …

Debezium日常分享系列之:Debezium2.7版本PostgreSQL数据库连接器

Debezium日常分享系列之:Debezium2.7版本PostgreSQL数据库连接器 一、概述二、连接器的工作原理安全快照初始快照的默认工作流程行为临时快照触发临时增量快照触发临时阻塞快照增量快照增量快照流程Debezium 如何解决具有相同主键的记录之间的冲突快照窗口触发增量快照具有附加…

FPGA文档阅读

FPGA的文档没有相应的基础还真不容易看懂,下面是B站上对FPGA文档的解读(本文非对文档解读,只是为个人记录第三期:CycloneIV E最小系统板设计(一)从Datasheet上获取FPGA的基本参数_哔哩哔哩_bilibili 电源部份 核心电…

算法力扣刷题记录 五十二【617.合并二叉树】

前言 二叉树篇,继续。 记录 五十二【617.合并二叉树】 一、题目阅读 给你两棵二叉树: root1 和 root2 。 想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要…

C语言 杂项笔记

这一篇需要修改 todo C语言知识点 在函数中, 传入一个字符串: 使用字符数组: void getLength(char name[])使用指针: void getLen(char *name) 一个中文字符, 在UTF-8编码中占用3个字节 sizeof() 是一运算符, 返回的单位是字节 sleep(1);…

19-2 LLM之野望 2 - LLM给到Quora面临的困境

Quora 有一个简单的前提:它是一个分享知识和专业知识的地方,好奇的人可以就任何可以想象到的话题提出问题,并从平台博学的社区获得深思熟虑的、见识广博的答案。 想想雅虎答案 (Yahoo Answers),它适用于技术员工和格拉德威尔式的…

农业旅游与乡村旅游:融合绿色田野与诗意远方的经济新篇章

在这个快节奏的时代,人们对于回归自然、体验淳朴生活的渴望日益增强。农业旅游与乡村旅游,作为新兴的旅游形态,正逐步成为连接城市与乡村的桥梁,不仅为都市人提供了一片心灵的栖息地,也为农村地区带来了前所未有的发展…

springboot集成MQTT实现消息接收

MQTT介绍 简单来说MQTT是一种协议&#xff0c;用来解决物联网之间的数据传输&#xff0c;它功耗更低&#xff0c;稳定性也不错&#xff0c;现在很多物联网的设备都在使用mqtt。感兴趣可以查看详情中文介绍 SpringBoot集成Mqtt 引入pom文件 <dependency><groupId&g…

xhdra的使用记录

XHydra是一个基于Hydra的分布式密码破解工具&#xff0c;用于进行暴力破解攻击。以下是在Kali Linux中使用XHydra的完整步骤和命令&#xff0c;以及一个示例&#xff1a; 安装XHydra&#xff1a; 在Kali Linux中&#xff0c;XHydra通常已经预装在系统中。如果没有安装&#xff…

Python3.4.4 32位

Python 3.4.4是Python编程语言的一个稳定版本&#xff0c;发布于2015年&#xff0c;主要针对32位操作系统设计。对于那些仍然运行Windows XP的用户来说&#xff0c;这是他们可以安装的最高版本的Python&#xff0c;因为从Python 3.5开始&#xff0c;官方停止了对Windows XP的支…

L298N的输出电流与电压

一、L298N的电流输出范围 L298N的输出电流为2A&#xff0c;瞬间峰值电流可达4A。 L298N是一款意法半导体生产的双路全桥式电机驱动芯片&#xff0c;广泛应用于各种电子和机械控制项目中&#xff0c;如驱动继电器、电磁阀、直流电机和步进电机等。其输出电流之所以重要&#x…

Jenkins及其相关插件的具体流程

目录 一、安装Jenkins二、配置Jenkins三、创建项目并配置构建任务四、运行和监控构建任务五、维护和优化 一、安装Jenkins 下载Jenkins安装包&#xff1a; 访问Jenkins官方网站&#xff08;https://www.jenkins.io/&#xff09;下载页面&#xff0c;选择合适的安装包。对于Linu…

Apache BookKeeper 一致性协议解析

导语 Apache Pulsar 是一个多租户、高性能的服务间消息传输解决方案&#xff0c;支持多租户、低延时、读写分离、跨地域复制&#xff08;GEO replication&#xff09;、快速扩容、灵活容错等特性。Pulsar 存储层依托于 BookKeeper 组件&#xff0c;所以本文简单探讨一下 BookK…

Six common classification algorithms in machine learning

分类算法是一种机器学习算法&#xff0c;其主要目的是从数据中发现规律并将数据分成不同的类别。分类算法通过对已知类别训练集的计算和分析&#xff0c;从中发现类别规则并预测新数据的类别。常见的分类算法包括决策树、朴素贝叶斯、逻辑回归、K-最近邻、支持向量机等。分类算…

浅谈:网络协议及网络连接

事情的起因 怪有意思的。&#xff08;纯纯唠嗑&#xff0c;不感兴趣的可以跳过&#xff09; 我们初中&#xff0c;在学期的最后一天换教室&#xff0c;由于我们是十三班&#xff0c;是年级里面的一个“例外”。因为我们其他年级都是12个和10个班级&#xff0c;就我们一个奇数…

【Mysql关于读已提交和可重复读(Read Committed)隔离级别下解决幻读的方案】

目录 读已提交&#xff08;Read Committed&#xff09;隔离级别 解决幻读问题的方法 总结 可重复读&#xff08;Read Committed&#xff09;隔离级别 幻读问题 MVCC机制 解决幻读 数据库支持 示例 注意 读已提交&#xff08;Read Committed&#xff09;隔离级别 在“…

DDei在线设计器-HTML渲染

Html渲染 HtmlViewer插件通过将一个外部DIV附着在图形控件上&#xff0c;从而改变原有图形的显示方式。允许使用者自己定义HTML通过HTML元素。本示例演示了通过Html来扩展渲染图形&#xff0c;从而获得更加丰富的图形展现。 通常情况下&#xff0c;我们创建的图形控件&#xff…

springboot的简单应用

Mvc与三层架构 创建Spring项目 勾选web和mabais框架 配置yml文件&#xff0c;这里创建spring项目默认生成的是propertise文件&#xff0c;但是properties文件的格式看起来没有yml文件一目了然。yml文件配置数据库还有映射mapper层的xml文件以及设置日志级别&#xff0c;比如map…

ESC(ELectronic Stability Control,电子稳定控制系统)

ESC通过实时监测车辆的动态参数&#xff0c;以及车辆轮胎的实际运动状态&#xff0c;通过调节车辆制动系统和发动机输出力&#xff0c;使车辆在紧急或危险情况下保持稳定&#xff0c;防止侧滑和失控。 ESC组成部分 传感器&#xff1a;用于检测车辆的动态参数&#xff0c;如车…

去中心化技术的变革力量:探索Web3的潜力

随着区块链技术的发展和应用&#xff0c;去中心化技术正成为数字世界中的一股强大变革力量。Web3作为去中心化应用的新兴范式&#xff0c;正在重新定义人们对于数据、互联网和价值交换的认知。本文将探索去中心化技术的基本概念、Web3的核心特征及其潜力应用&#xff0c;展示其…