当前位置: 首页 > 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;用户可以按照实际需求迅速获取或释放…...

5个步骤安全使用YimMenu:GTA5 DLL注入入门指南

5个步骤安全使用YimMenu&#xff1a;GTA5 DLL注入入门指南 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMenu …...

2025届毕业生推荐的降重复率神器解析与推荐

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 如果要降低AIGC检测率&#xff0c;那就得着重从文本特征方面着手。首先&#xff0c;词汇多样…...

ComfyUI Essentials:填补ComfyUI核心缺失功能的必备插件指南

ComfyUI Essentials&#xff1a;填补ComfyUI核心缺失功能的必备插件指南 【免费下载链接】ComfyUI_essentials 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI_essentials ComfyUI Essentials是一款专门为ComfyUI用户设计的插件&#xff0c;它提供了ComfyUI核心…...

计算机毕业设计:Python智慧出行数据分析系统 Django框架 可视化 数据大屏 数据分析 大数据 机器学习 深度学习(建议收藏)✅

1、项目介绍 技术栈&#xff1a;Python语言、Django框架、ECharts可视化库、数据大屏技术。 功能模块&#xff1a; 首页模块数据大屏模块数据分析模块数据查看模块登录模块后台管理模块订单管理模块用户管理模块 项目介绍&#xff1a;滴滴出行数据分析平台基于Django框架开发&a…...

ozz-animation多格式导入工具链详解:FBX、glTF、Collada全支持

ozz-animation多格式导入工具链详解&#xff1a;FBX、glTF、Collada全支持 【免费下载链接】ozz-animation Open source c skeletal animation library and toolset 项目地址: https://gitcode.com/gh_mirrors/oz/ozz-animation ozz-animation是一款开源C骨骼动画库和工…...

Mac开发者必看:如何同时管理Protobuf 2.6.1和3.19.4版本(附.proto文件编译避坑指南)

Mac开发者必看&#xff1a;如何同时管理Protobuf 2.6.1和3.19.4版本&#xff08;附.proto文件编译避坑指南&#xff09; 在跨版本协议开发中&#xff0c;Mac开发者常面临一个棘手问题&#xff1a;如何在同一台机器上同时维护Protobuf 2.6.1和3.19.4两个不兼容的版本&#xff1f…...

Java8时间魔法:Duration与Period实战,精准掌控时间与日期间隔

1. Duration与Period&#xff1a;Java8的时间魔法棒 第一次接触Java8的日期时间API时&#xff0c;我被LocalDate和LocalDateTime的简洁惊艳到了。但真正让我感受到时间魔法魅力的&#xff0c;是在处理两个时间点间隔时遇到的Duration和Period。记得有次做会员系统&#xff0c;…...

三星固件管理的终极跨平台解决方案:Bifrost技术深度解析与实践指南

三星固件管理的终极跨平台解决方案&#xff1a;Bifrost技术深度解析与实践指南 【免费下载链接】SamloaderKotlin 项目地址: https://gitcode.com/gh_mirrors/sa/SamloaderKotlin 对于三星设备用户和开发者而言&#xff0c;获取官方固件一直是个技术难题。传统方法要么…...

别再手动画码了!C#搭配ZXing.Net库,5分钟搞定商品标签一维码与会员卡二维码生成

企业级条码生成实战&#xff1a;用C#和ZXing.Net实现高效标签与会员卡管理 在仓储物流和会员管理的数字化浪潮中&#xff0c;条码技术早已从简单的商品标识进化为企业数据流转的核心枢纽。想象一下这样的场景&#xff1a;当仓库管理系统(WMS)收到订单时&#xff0c;系统自动生成…...

在WSL2上搞定PyTorch模型转昇腾OM:我的Atlas 200DK部署踩坑实录

在WSL2上实现PyTorch模型到昇腾OM的高效转换&#xff1a;避坑指南与实战解析 对于希望在Windows环境下完成昇腾模型转换的开发者来说&#xff0c;WSL2提供了一个近乎完美的解决方案。本文将深入探讨如何在这一环境中高效完成从PyTorch到昇腾OM模型的完整转换流程&#xff0c;同…...