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结构
背景:服务端使用Java开发的,接口需要客户端传一个RSA公钥,手机端使用Flutter开发的,然后就选择使用 pointycastle 生成密钥,很不巧,dart版本不像Java一样有个可以直接获取编码过的公钥信息的方法࿱…...

友思特方案 | 低延迟GigE Vision解决方案:用于红外设备、医疗和工业级探测面板
导读 维持实时视频系统软硬件的长期成本效益,是该系统在医疗、工业等领域广泛应用的前提。友思特低延迟GigE Vision解决方案创新性地突破了这一难题,提供高带宽且高可靠性的端到端网络链接,有效降低了开发成本、复杂性和时间。 引言 虽然实…...
网络安全策略:优先防护而非溯源的重要性
面对网络攻击,企业往往面临一个关键决策点:是立即投入资源进行攻击溯源,还是优先加强自身的防御体系。尽管溯源分析有助于了解攻击者的手段和动机,但在大多数情况下,优先强化防护是更为明智的选择。本文将探讨为何在遭…...
ES6 Iterator 与 for...of 循环(五)
Iterator 特性: 统一的接口:无论是数组、字符串还是自定义对象,只要它们有默认的迭代器,就可以使用 for…of 循环进行遍历。可迭代对象:具有 [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零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…...

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

Python | Leetcode Python题解之第227题基本计算器II
题目: 题解: 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语言实现的,c语言中是自带字符串的,但是为什么redis还要再实现自己的动态字符串呢,这种动态字符串的底层数据结构是怎样的呢?接下来我们带着这些问题来看一看redis中的动态字符串sds。 2.sds的组成 struct __at…...
路由协议的优先级,以及管理距离 AD 和 metric 的区别
路由协议的优先级(Preference,即管理距离 Administrative Distance )一般为一个 0 到 255 之间的数字,数字越大则优先级越低。表一是通常情况下各路由协议的优先级规定: 表一:一般路由协议优先级 路由协议…...

力扣 24两两交换链表中节点
画图 注意有虚拟头结点 注意判断时先判断cur->next ! nullptr,再判断cur->next->next ! nullptr 注意末尾返回dumyhead->next,用新建result指针来接并返回 class Solution { public:ListNode* swapPairs(ListNode* head) {ListNode *dummyhead new …...

C# + halcon 联合编程示例
C# halcon 联合编程示例 实现功能 1.加载图像 2.画直线,画圆,画矩形, 画椭圆 ROI,可以调整大小和位置 3.实现找边,找圆功能 效果 开发环境 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操作:将工作区中所有文件的修改内容 添加进版本库的暂存区中。commit操作:…...

Aop切面编程(2)--代理模式
1、代理模式的理解:不修改A对象的代码的基础上,对A代码块进行拓展。通过创建ProxyA代理对象,拓展A对象并调用A对象的核心功能; 即:不修改对象的源码基础上,创建代理对象,进行功能的附加和增强&…...
Spring Boot(八十):Tesseract实现图片文字自动识别
1Tesseract 要实现图片转文字(OCR,Optical Character Recognition)功能,可以使用一些现有的OCR库,比如Google的Tesseract或者百度AI、阿里云OCR等云服务。 下面以Tesseract为例: Tesseract是一个开源文本识别 (OCR)引擎,是目前公认最优秀、最精确的开源OCR系统,用于…...
QT 图片处理
1.qt 图片控件 在Qt中,用于显示图片的控件主要是QLabel。以下是关于Qt图片控件的详细介绍: QLabel控件: QLabel是Qt中用于显示文本或图片的控件。在显示图片时,QLabel通过setPixmap()函数来设置要显示的图片。QPixmap代表Qt中的…...
Linux C++ 053-设计模式之模板方法模式
Linux C 053-设计模式之模板方法模式 本节关键字:Linux、C、设计模式、模板方法模式 相关库函数: 概念 模板方法模式定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式。让子类别在不改变算法架构的情况下,重新…...

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

基于信号处理的PPG信号滤波降噪方法(MATLAB)
光电容积脉搏波PPG信号结合相关算法可以用于人体生理参数检测,如血压、血氧饱和度等,但采集过程中极易受到噪声干扰,对于血压、血氧饱和度测量的准确性造成影响。随着当今社会医疗保健技术的发展,可穿戴监测设备对于PPG信号的质量…...
新一代信息技术及应用
关于云计算的描述不正确的是( )。 A 云计算可以通过网络连接,用户通过网络接入“云”中并获得有关的服务,“云”内节点之间也通过内部的网络相连 B 云计算可以快速、按需、弹性服务,用户可以按照实际需求迅速获取或释放…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...

WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...

ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]
报错信息:libc.so.6: cannot open shared object file: No such file or directory: #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...
comfyui 工作流中 图生视频 如何增加视频的长度到5秒
comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗? 在ComfyUI中实现图生视频并延长到5秒,需要结合多个扩展和技巧。以下是完整解决方案: 核心工作流配置(24fps下5秒120帧) #mermaid-svg-yP…...