当前位置: 首页 > news >正文

Java查看RSA密钥的ASN1结构

背景:服务端使用Java开发的,接口需要客户端传一个RSA公钥,手机端使用Flutter开发的,然后就选择使用 pointycastle 生成密钥,很不巧,dart版本不像Java一样有个可以直接获取编码过的公钥信息的方法:publicKey.getEncoded() ,dart 版本的 RSAPublicKey 只有 modulus 和 publicExponent,需要自行编码。

大概研究了一下,数据是使用ASN1,于是看了下Java编码前的数据结构是什么样子的(当然,也可以看相关的技术文档,我一时半会儿没找到,也懒得找),项目需要添加下面的依赖:

<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk18on</artifactId><version>1.78.1</version>
</dependency>

使用下面的Java代码,打印出来,结构一目了然: 

import org.bouncycastle.asn1.*;import java.io.IOException;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;public class Main {public static void main(String[] args) throws NoSuchAlgorithmException {KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");keyPairGenerator.initialize(2048);KeyPair keyPair = keyPairGenerator.generateKeyPair();RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();System.out.printf("publicKey Algorithm: %s, format: %s\n", publicKey.getAlgorithm(), publicKey.getFormat());System.out.println("PublicKey Info:");System.out.println("\tModulus: " + publicKey.getModulus());System.out.println("\tPublic Exponent: " + publicKey.getPublicExponent());parseASN1(publicKey.getEncoded(), 0);System.out.println();System.out.printf("privateKey Algorithm: %s, format: %s\n", privateKey.getAlgorithm(), privateKey.getFormat());System.out.println("PrivateKey Info:");System.out.println("\tModulus: " + privateKey.getModulus());System.out.println("\tPrivate Exponent: " + privateKey.getPrivateExponent());parseASN1(privateKey.getEncoded(), 0);}private static void parseASN1(byte[] data, int indent) {try (ASN1InputStream asn1InputStream = new ASN1InputStream(data)) {ASN1Primitive primitive;while ((primitive = asn1InputStream.readObject()) != null) {parseASN1Encodable(primitive, indent);}} catch (IOException e) {throw new RuntimeException(e);}}private static void parseASN1Encodable(ASN1Encodable primitive, int indent) {printIndent(indent);if (primitive instanceof ASN1Sequence) {System.out.println("ASN1Sequence:");((ASN1Sequence) primitive).forEach(e -> parseASN1Encodable(e, indent + 1));} else if (primitive instanceof ASN1BitString) {System.out.println("ASN1BitString");parseASN1(((ASN1BitString) primitive).getOctets(), indent + 1);} else if (primitive instanceof ASN1OctetString) {System.out.println("ASN1OctetString");parseASN1(((ASN1OctetString) primitive).getOctets(), indent + 1);} else if (primitive instanceof ASN1Integer) {ASN1Integer asn1Integer = (ASN1Integer) primitive;System.out.printf("ASN1Integer: %s\n", asn1Integer.getValue());} else if (primitive instanceof ASN1ObjectIdentifier) {ASN1ObjectIdentifier asn1ObjectIdentifier = (ASN1ObjectIdentifier) primitive;System.out.printf("OID: %s\n", asn1ObjectIdentifier.getId());} else if (primitive instanceof DERNull){System.out.println("DERNull");} else {System.out.println("primitive Class: " + primitive.getClass());System.out.println("primitive: " + primitive);}}private static void printIndent(int tabCount) {for (int i = 0; i < tabCount; i++) {System.out.print('\t');}}
}

dart版本对公钥进行编码的代码写在另一篇文章了:Flutter RSA公钥转PEM​​​​​​​ 

相关文章:

Java查看RSA密钥的ASN1结构

背景&#xff1a;服务端使用Java开发的&#xff0c;接口需要客户端传一个RSA公钥&#xff0c;手机端使用Flutter开发的&#xff0c;然后就选择使用 pointycastle 生成密钥&#xff0c;很不巧&#xff0c;dart版本不像Java一样有个可以直接获取编码过的公钥信息的方法&#xff1…...

友思特方案 | 低延迟GigE Vision解决方案:用于红外设备、医疗和工业级探测面板

导读 维持实时视频系统软硬件的长期成本效益&#xff0c;是该系统在医疗、工业等领域广泛应用的前提。友思特低延迟GigE Vision解决方案创新性地突破了这一难题&#xff0c;提供高带宽且高可靠性的端到端网络链接&#xff0c;有效降低了开发成本、复杂性和时间。 引言 虽然实…...

网络安全策略:优先防护而非溯源的重要性

面对网络攻击&#xff0c;企业往往面临一个关键决策点&#xff1a;是立即投入资源进行攻击溯源&#xff0c;还是优先加强自身的防御体系。尽管溯源分析有助于了解攻击者的手段和动机&#xff0c;但在大多数情况下&#xff0c;优先强化防护是更为明智的选择。本文将探讨为何在遭…...

ES6 Iterator 与 for...of 循环(五)

Iterator 特性&#xff1a; 统一的接口&#xff1a;无论是数组、字符串还是自定义对象&#xff0c;只要它们有默认的迭代器&#xff0c;就可以使用 for…of 循环进行遍历。可迭代对象&#xff1a;具有 [Symbol.iterator] 属性的对象被认为是可迭代的。[Symbol.iterator] 是一个…...

typora删除多余图片

import os import re import shutil from bs4 import BeautifulSoupimport warningswarnings.filterwarnings(ignore) # 定义正则表达式用于匹配.md文件中的图片引用语句 pattern re.compile(r!\[.*]\((.*)\))# 获取所有.md文件中的图片引用路径 references set() md_filepat…...

【ceph】ceph-mon重新选举的情况

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…...

PopClip(Mac 划词增强工具)值得购买吗?

PopClip 是一款 Mac 划词操作增强工具&#xff0c;可选装翻译搜索、格式转换等丰富扩展&#xff0c;联动多种软件执行创建提醒事项、添加到笔记等快捷操作&#xff0c;有效提升工作效率。 在 iPhone 或 iPad 内&#xff0c;选词后就会弹出气泡菜单&#xff0c;让你选择执行各种…...

Python | Leetcode Python题解之第227题基本计算器II

题目&#xff1a; 题解&#xff1a; class Solution:def calculate(self, s: str) -> int:n len(s)stack []preSign num 0for i in range(n):if s[i] ! and s[i].isdigit():num num * 10 ord(s[i]) - ord(0)if i n - 1 or s[i] in -*/:if preSign :stack.append(…...

redis源码分析之底层数据结构(一)-动态字符串sds

1.绪论 我们知道redis是由c语言实现的&#xff0c;c语言中是自带字符串的&#xff0c;但是为什么redis还要再实现自己的动态字符串呢&#xff0c;这种动态字符串的底层数据结构是怎样的呢?接下来我们带着这些问题来看一看redis中的动态字符串sds。 2.sds的组成 struct __at…...

路由协议的优先级,以及管理距离 AD 和 metric 的区别

路由协议的优先级&#xff08;Preference&#xff0c;即管理距离 Administrative Distance &#xff09;一般为一个 0 到 255 之间的数字&#xff0c;数字越大则优先级越低。表一是通常情况下各路由协议的优先级规定&#xff1a; 表一&#xff1a;一般路由协议优先级 路由协议…...

力扣 24两两交换链表中节点

画图 注意有虚拟头结点 注意判断时先判断cur->next ! nullptr,再判断cur->next->next ! nullptr 注意末尾返回dumyhead->next&#xff0c;用新建result指针来接并返回 class Solution { public:ListNode* swapPairs(ListNode* head) {ListNode *dummyhead new …...

C# + halcon 联合编程示例

C# halcon 联合编程示例 实现功能 1.加载图像 2.画直线&#xff0c;画圆&#xff0c;画矩形, 画椭圆 ROI&#xff0c;可以调整大小和位置 3.实现找边&#xff0c;找圆功能 效果 开发环境 Visual Studio 2022 .NET Framework 4.8 halcondotnet.dll 查看帮助文档 项目结构 DL…...

【Git基本操作】添加文件 | 修改文件 | 及其各场景下.git目录树的变化

目录 1. 添加文件&add操作和commit操作 2. .git树状目录的变化 3. git其他操作 4. 修改文件 4.1 git status 4.2 git diff 1. 添加文件&add操作和commit操作 add操作&#xff1a;将工作区中所有文件的修改内容 添加进版本库的暂存区中。commit操作&#xff1a;…...

Aop切面编程(2)--代理模式

1、代理模式的理解&#xff1a;不修改A对象的代码的基础上&#xff0c;对A代码块进行拓展。通过创建ProxyA代理对象&#xff0c;拓展A对象并调用A对象的核心功能&#xff1b; 即&#xff1a;不修改对象的源码基础上&#xff0c;创建代理对象&#xff0c;进行功能的附加和增强&…...

Spring Boot(八十):Tesseract实现图片文字自动识别

1Tesseract 要实现图片转文字(OCR,Optical Character Recognition)功能,可以使用一些现有的OCR库,比如Google的Tesseract或者百度AI、阿里云OCR等云服务。 下面以Tesseract为例: Tesseract是一个开源文本识别 (OCR)引擎,是目前公认最优秀、最精确的开源OCR系统,用于…...

QT 图片处理

1.qt 图片控件 在Qt中&#xff0c;用于显示图片的控件主要是QLabel。以下是关于Qt图片控件的详细介绍&#xff1a; QLabel控件&#xff1a; QLabel是Qt中用于显示文本或图片的控件。在显示图片时&#xff0c;QLabel通过setPixmap()函数来设置要显示的图片。QPixmap代表Qt中的…...

Linux C++ 053-设计模式之模板方法模式

Linux C 053-设计模式之模板方法模式 本节关键字&#xff1a;Linux、C、设计模式、模板方法模式 相关库函数&#xff1a; 概念 模板方法模式定义了一个算法的步骤&#xff0c;并允许子类别为一个或多个步骤提供其实践方式。让子类别在不改变算法架构的情况下&#xff0c;重新…...

【Python 项目】类鸟群:仿真鸟群

类鸟群&#xff1a;仿真鸟群 仔细观察一群鸟或一群鱼&#xff0c;你会发现&#xff0c;虽然群体由个体生物组成&#xff0c;但该群体作为一个整体似乎有它自己的生命。鸟群中的鸟在移动、飞越和绕过障碍物时&#xff0c;彼此之间相互定位。受到打扰或惊吓时会破坏编队&#xf…...

基于信号处理的PPG信号滤波降噪方法(MATLAB)

光电容积脉搏波PPG信号结合相关算法可以用于人体生理参数检测&#xff0c;如血压、血氧饱和度等&#xff0c;但采集过程中极易受到噪声干扰&#xff0c;对于血压、血氧饱和度测量的准确性造成影响。随着当今社会医疗保健技术的发展&#xff0c;可穿戴监测设备对于PPG信号的质量…...

新一代信息技术及应用

关于云计算的描述不正确的是&#xff08; &#xff09;。 A 云计算可以通过网络连接&#xff0c;用户通过网络接入“云”中并获得有关的服务&#xff0c;“云”内节点之间也通过内部的网络相连 B 云计算可以快速、按需、弹性服务&#xff0c;用户可以按照实际需求迅速获取或释放…...

C#实现稳定Windows低级鼠标钩子(WH_MOUSE_LL)全解析

1. 为什么“鼠标钩子”不是炫技&#xff0c;而是解决真实问题的底层能力在Windows桌面应用开发中&#xff0c;我见过太多人把“全局鼠标监听”当成一个玄乎其玄的功能——要么觉得它危险、难搞、容易被杀毒软件误报&#xff1b;要么干脆绕开&#xff0c;用轮询GetCursorPos这种…...

Linux内核启动时,你的isolcpus参数到底经历了什么?从GRUB到CPU掩码的完整旅程

Linux内核启动时&#xff0c;isolcpus参数的奇幻漂流&#xff1a;从GRUB配置到CPU隔离的完整解密当你在GRUB配置文件中写下isolcpus2-3这行看似简单的指令时&#xff0c;可能不会想到这个字符串将经历一场跨越多个软件层的奇妙旅程。本文将带你以侦探视角&#xff0c;追踪这个参…...

ISP模型与硬件平台配置迁移实践指南

1. 理解ISP模型与硬件平台的配置迁移在图像信号处理器&#xff08;ISP&#xff09;开发过程中&#xff0c;我们经常需要在软件模型和实际硬件平台之间进行配置迁移。这种迁移的核心挑战在于确保模型仿真结果与硬件输出完全一致。根据我的经验&#xff0c;这涉及到两个主要操作模…...

国防采购如何吸引商业AI创新:OTA协议与敏捷合作模式解析

1. 项目概述&#xff1a;当国防采购遇上商业AI创新在过去的十几年里&#xff0c;我接触过不少政府与科技企业间的合作项目&#xff0c;从早期的云计算服务到后来的大数据分析平台。但最近几年&#xff0c;一个趋势愈发明显&#xff1a;以人工智能为代表的颠覆性技术&#xff0c…...

仓储海量货物人车混跑,无感定位并发能力碾压UWB上限瓶颈技术白皮书方案

仓储海量货物人车混跑&#xff0c;无感定位并发能力碾压UWB上限瓶颈技术白皮书方案一、方案概述随着现代智能仓储向高密度、高周转、无人化、集约化模式快速迭代&#xff0c;立体仓储库区普遍形成海量货物堆叠、多叉车穿梭、人员高频作业、人车密集混跑的复杂动态工况。仓储作业…...

对比体验使用Taotoken聚合接口与直连原厂API的延迟与稳定性差异

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 对比体验使用Taotoken聚合接口与直连原厂API的延迟与稳定性差异 1. 引言 在集成大模型能力到实际业务时&#xff0c;开发者除了关…...

深度强化学习与控制2026 课程总结Week2

深度Q网络——DQN算法流程&#xff1a; (1) 初始化网络参数 (2) 初始化网络参数 (3) 初始化经验回放池R (4) 进入循环迭代训练&#xff1a;for 序列 do获取初始状态for 时间步 do 根据以贪婪策略选择动作&#xff0c;获得,存入经验回放池R若R中数据充足&#xff0c;从R中采样…...

30个专业模板轻松美化Power BI报表:零基础也能打造惊艳数据可视化

30个专业模板轻松美化Power BI报表&#xff1a;零基础也能打造惊艳数据可视化 【免费下载链接】PowerBI-ThemeTemplates Snippets for assembling Power BI Themes 项目地址: https://gitcode.com/gh_mirrors/po/PowerBI-ThemeTemplates 还在为Power BI报表设计发愁吗&a…...

Locale Remulator终极指南:Windows系统区域和语言模拟解决方案

Locale Remulator终极指南&#xff1a;Windows系统区域和语言模拟解决方案 【免费下载链接】Locale_Remulator System Region and Language Simulator. 项目地址: https://gitcode.com/gh_mirrors/lo/Locale_Remulator Locale Remulator是一款强大的Windows系统区域和语…...

对比Token Plan与按量计费,如何为你的项目选择更经济的消费模式

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 对比Token Plan与按量计费&#xff0c;如何为你的项目选择更经济的消费模式 对于使用大模型API的开发者而言&#xff0c;成本控制是…...