广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Go DSA 和 Java DSA 的区别
  • 734
分享到

Go DSA 和 Java DSA 的区别

2024-04-05 00:04:35 734人浏览 安东尼
摘要

本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《Go DSA 和 Java DSA 的区别》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~问题内容 go

本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《Go DSA 和 Java DSA 的区别》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~

问题内容

  1. go 使用 dsa 私钥生成签名
  2. java 使用 dsa 公钥验证第一步结果
  3. java 应该返回 true,但返回 false
package main
import (
    "crypto/dsa"
    "crypto/rand"
    "encoding/asn1"
    "encoding/hex"
    "fmt"
    "golang.org/x/crypto/ssh"
    "math/big"
)

func main() {
    // a dsa private key
    pemdata := []byte("-----begin dsa private key-----\n" +
        "miibvaibaakbgqd9f1obhxuskvlfspwu7otn9hg3ujzvraddhj+atlemauvdqcjr\n" +
        "+1k9jvj6v8x1ujd2y5tvbnebo4adng/yzmc3a5lqpasfn+geexaiwk+7qdf+t8yb\n" +
        "+dtx58aophupbpud9tpfhsmcnvQtwharmvz1864rydcq7/iiaxmd0ugbxwivajdg\n" +
        "ui8viwvmspk5gqlrhavwwbz1aogbapfhoixwmz3ey7yrxda4v7l5lk+7+jrqgvlx\n" +
        "tas9b4jnuvlxjrruwu/mcqcqgyc0srzxi+hmkbytt88jmozipue8fnqlvhynkocj\n" +
        "rh4rs6z1kw6jfwv6itvi8ftiegeko8yk8b6ouzcjqipf4vrlnwasi2zeghtvjwqb\n" +
        "tdv+z0kqaogbaib9o0kpsjadzjk571e1mx7zheyjgrcxhin2sw8iztebqrkkimxp\n" +
        "nltwm234ubdtzvhe3udwzpfhpmirmwbjcydfrowwwvrdhdfxzlpcyp1gmwqj11dh\n" +
        "3fi3+o43Devrsyyulrvcnq1j3ivgwy5ndrpzu7n6y8dph4/4ebt7kvnvahr4vwun\n" +
        "fhu/+4agavemea814i3dqg==\n" +
        "-----end dsa private key-----")
    // parse dsa 
    p, _ := ssh.parserawprivatekey(pemdata)
    pp := p.(*dsa.privatekey)

    // orign data
    hashed := []byte{1}
    r, s, _ := dsa.sign(rand.reader, pp, hashed)

    type dsasignature struct {
        r, s *big.int
    }
    var ss dsasignature
    ss.s = s
    ss.r = r
    signaturebytes, _ := asn1.marshal(ss)

    // print sign 
    fmt.println(hex.encodetostring(signaturebytes))
}
  1. java 读取 dsa 公钥并初始化签名者
  2. java验证第一步标志结果
  3. 返回 false
@test
public void ttt() throws invalidkeyspecexception, nosuchalgorithmexception, invalidkeyexception, signatureexception {
        // dsa public key
        string pubkey = "-----begin public key-----\n" +
                "miibudccaswgbyqgsm44baewggefaogbap1/u4eddriput9knc7s5of2ebdspo9e\n" +
                "ammep4c2uszprv1ailh7wt2nwpq/xfw6mpblm1vs14e7gb00b/jmyldrmvclpj+f\n" +
                "6ar7eclct7up1/63xhv4o1fnxqimfq8e+4p208uewwi1vbnafpey9nxzrith1yrv\n" +
                "8iidgz3rsahhahual2bqjxujc8yykrmcouuec/byhpucgyea9+gghdabpd7lvktc\n" +
                "nrhxuxmur7v6ouqc+vdmcz0hgmdrwveoutrzt+zxbxcbglrjfnej6ewofho3zwky\n" +
                "jmim4twweotufi0o4kouhiuzpnwrbqn/c/ohnwlx+2j6asq7zktxvqhrkimog9/h\n" +
                "wuwfbpklzl6ae1ulzafmo/7pssodgyuaaogbaib9o0kpsjadzjk571e1mx7zheyj\n" +
                "grcxhin2sw8iztebqrkkimxpnltwm234ubdtzvhe3udwzpfhpmirmwbjcydfroww\n" +
                "wvrdhdfxzlpcyp1gmwqj11dh3fi3+o43devrsyyulrvcnq1j3ivgwy5ndrpzu7n6\n" +
                "y8dph4/4ebt7kvnv\n" +
                "-----end public key-----";
        string publickeypem = pubkey
                .replace("-----begin public key-----\n", "")
                .replaceall(system.lineseparator(), "")
                .replace("-----end public key-----", "");
        byte[] publicencoded = base64.decodebase64(publickeypem);
        keyfactory keyfactory1 = keyfactory.getinstance("dsa");
        x509encodedkeyspec publickeyspec = new x509encodedkeyspec(publicencoded);
        dsapublickey pubkeyy = (dsapublickey) keyfactory1.generatepublic(publickeyspec);

        // init signer
        signature sig1 = signature.getinstance("dsa");
        sig1.initverify(pubkeyy);
        sig1.update(new byte[]{1});
        
        // verify first result
        system.out.println(sig1.verify(hexutil.decodehex("first step result")));
}
  1. 我尝试在 java 实现中使用 nonewithdsa 但它没有这样做
  2. 签名 sig1 = signature.getinstance("nonewithdsa");
java.security.SignatureException: Data for RawDSA must be exactly 20 bytes long
  1. 我尝试在 java 实现中使用 sha1withdsa 但它没有这样做
  2. 签名 sig1 = signature.getinstance("sha1withdsa");
  3. 返回错误


正确答案


在 Java 中,(签名)算法名称 DSASHA1withDSA 的别名,即原始 FIPS186-0 算法。这与 Go 显然实现的非标准“原始”原语不同NONEwithDSA 确实是您想要的正确的 Java 名称,但是“标准”(SUN) 提供程序中的实现有点混乱,需要恰好 20 字节的数据,而不是更多或更少,因为这是 SHA1 的大小hash 是 FIPS186-3 之前 DSA 的唯一标准哈希值。

如果您(拥有或可以获得并)使用 BouncyCastle 提供程序,则它没有此限制,并且应该适用于更改为 NONEwithDSA 的代码(并且代码或安全配置已修改为当然,BC 被选为提供者)。

如果你不使用 Bouncy,我认为你必须自己编写算法;我认为没有任何方法可以让 SUN 实现执行您想要的操作。

尽管最好是按照标准而不是原始数据的方式对大小合适的哈希进行签名,然后您就可以使用指定和设计的 Java 提供程序。

终于介绍完啦!小伙伴们,这篇关于《Go DSA 和 Java DSA 的区别》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~编程网公众号也会发布Golang相关知识,快来关注吧!

您可能感兴趣的文档:

--结束END--

本文标题: Go DSA 和 Java DSA 的区别

本文链接: https://www.lsjlt.com/news/596731.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • go语言和java的区别有哪些
    区别:1、Go不允许函数重载,java允许;2、Java默认允许多态,Go没有;3、Go用HTTP协议进行路由配置,java不是;4、Go代码可以自动扩展到多个核心,而Java并不总是具有足够的可扩展性;5、Java对象的方法会有隐藏thi...
    99+
    2023-05-14
    go语言 java
  • go语言和java的区别是什么
    本篇内容主要讲解“go语言和java的区别是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“go语言和java的区别是什么”吧!区别:1、Go不允许函数重载,java允许;2、Java默认允许...
    99+
    2023-07-04
  • go install和go get的区别实例详解
    目录go get 和 go install 的区别go get命变更go get命令变更的原因GOMODULE常用命令总结 go get 和 go install 的区别 ...
    99+
    2023-01-28
    go get go install go install和go get
  • go和golang的区别有哪些
    这篇“go和golang的区别有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“go和golang的区别有哪些”文章吧。G...
    99+
    2023-07-05
  • golang和go的区别是什么
    "Golang" 和 "Go" 本质上是同一个编程语言,没有实质性的区别,它们只是在称呼上有些微差异,但指的都是同一个语言。因此,在讨论Go语言时,可以使用"Golang"或"Go"这两个术语中的任何一个。本教程操作系统:Windows10...
    99+
    2023-12-12
    go语言 Golang
  • java equals和==的区别
    java9举例代码: (推荐学习:java课程)String str1 = "abc"; String str2 = "abc"; String str3 = new String("abc"); String s...
    99+
    2015-02-02
    java入门 java
  • go和golang有什么区别
    Go和Golang其实是同一个编程语言的不同称呼,Go语言是由Google开发的一种静态类型、编译型、并发型的编程语言。Go语言的设计目标是提高程序的开发效率和执行效率,同时保持代码简洁和易读。详细介绍:Go语言是一种简洁、高效、并发的编程...
    99+
    2023-12-14
    go语言 Golang
  • java和java web区别
    java和java web区别人们平常说的Java一般指JavaSE,也就是Java Standard Edition,Java的标准版,一般用来开发桌面应用程序,但是在开发桌面应用程序上相对VB,Delphi,VC++并没有什么优势。而J...
    99+
    2022-01-04
    java
  • 一文聊聊go和golang区别
    Go(又称Golang)是一门由谷歌开发的编程语言,由于其高效、简单和安全等特点,近年来在开发领域广受欢迎。然而,有些人会困惑,Go和Golang之间到底有什么区别呢?在本文中,我们将详细介绍这两者之间的异同。Go和Golang连同其它语言...
    99+
    2023-05-14
    Golang
  • Python和Go的关键区别有哪些
    这篇文章主要介绍“Python和Go的关键区别有哪些”,在日常操作中,相信很多人在Python和Go的关键区别有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python和Go的关键区别有哪些”的疑惑有所...
    99+
    2023-06-16
  • php和go语言的区别有哪些
    本篇内容介绍了“php和go语言的区别有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!区别:1、Go是一种可用于快速机器代码编译的编程语...
    99+
    2023-07-04
  • go语言和kotlin的区别有哪些
    这篇文章主要介绍了go语言和kotlin的区别有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。区别:1、Kotlin是多范式语言,对泛型与函数式有良好支持;而Go对泛型支...
    99+
    2023-06-15
  • vue中go和back的区别有哪些
    这篇文章主要讲解了“vue中go和back的区别有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue中go和back的区别有哪些”吧!vue中go和back的区别是:1、利用go()返...
    99+
    2023-06-29
  • python和go语言的区别有什么
    本篇文章为大家展示了python和go语言的区别有什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。go语言Go(又称 Golang)是 Google 的 Robert Griesemer,Rob ...
    99+
    2023-06-15
  • java中HashMap和LinkedHashMap的区别
    HashMaphashMap是最常用的Map,根据键的HashCode值存储数据,可以根据键直接获取它的值,具有很快的访问速度,遍历时候的顺序是完全随机的。HashMap只允许一个键为Null,允许多个值为Null。特性: 完全随机优点: ...
    99+
    2019-03-31
    java HashMap LinkedHashMap 区别
  • java中comparable和comparator的区别
    确定两个对象之间的大小关系及排列顺序称为比较,能实现这个比较功能的类或方法称之为比较器,在java中有两种比较器。内部比较器(Comparable接口)和外部比较器(Comparator接口)一、比较器排序Comparator的使用——可以...
    99+
    2015-02-01
    java comparable comparator 区别
  • java中栈和堆的区别
    在说堆和栈之前,我们先说一下JVM(虚拟机)内存的划分: (推荐学习:java课程)Java程序在运行时都要开辟空间,任何软件在运行时都要在内存中开辟空间,Java虚拟机运行时也是要开辟空间的。JVM运行时在内存中开辟一片内存区...
    99+
    2021-03-03
    java入门 java
  • java中print和println的区别
    printprintln的区别 (推荐学习:java课程)print将它的参数显示在命令窗口,并将输出光标定位在所显示的最后一个字符之后。println 将它的参数显示在命令窗口,并在结尾加上换行符,将输出光标定位在下一行的...
    99+
    2017-03-18
    java入门 java
  • java中int和Integer的区别
    java中int和Integer的区别:类型不同,int是数据类型,而integer是引用类型。int存储的是数值,integer存储的是引用对象的地址。integer对象会占用更多的内存,而int占用的空间少。Integer变量与int变...
    99+
    2022-10-20
  • Java中NoClassDefFoundError 和 ClassNotFoundException的区别
    目录NoClassDefFoundErrorClassNotFoundException解决办法前言: 从类继承层次上来看,ClassNotFoundException是从Exce...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作