「java运行ecdsa」JAVA运行环境

博主:adminadmin 2023-01-22 00:09:11 290

今天给各位分享java运行ecdsa的知识,其中也会对JAVA运行环境进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

求ECDSA的Java代码

【方案1】

package ECDSA;

import com.sun.org.apache.xerces.internal.impl.dv.util.HexBin;

import java.security.*;

import java.security.interfaces.ECPrivateKey;

import java.security.interfaces.ECPublicKey;

import java.security.spec.PKCS8EncodedKeySpec;

import java.security.spec.X509EncodedKeySpec;

public class Ecdsa {

  private static String src = "hello berber" ;

  public static void main(String []args){

      jdkECDSA();

  }

  public static void jdkECDSA(){

      // 1.初始化密钥

      try{

          KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC");

          keyPairGenerator.initialize(256);

          KeyPair keyPair = keyPairGenerator.generateKeyPair() ;

          ECPublicKey ecPublicKey = (ECPublicKey)keyPair.getPublic() ;

          ECPrivateKey ecPrivateKey = (ECPrivateKey)keyPair.getPrivate() ;

          // 执行签名

          PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(ecPrivateKey.getEncoded());

          KeyFactory keyFactory = KeyFactory.getInstance("EC") ;

          PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec) ;

          Signature signature = Signature.getInstance("SHA1withECDSA");

          signature.initSign(privateKey);

          signature.update(src.getBytes());

          byte []arr = signature.sign();

          System.out.println("jdk ecdsa sign :"+ HexBin.encode(arr));

          // 验证签名

          X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(ecPublicKey.getEncoded());

          keyFactory = KeyFactory.getInstance("EC");

          PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);

          signature = Signature.getInstance("SHA1withECDSA");

          signature.initVerify(publicKey);

          signature.update(src.getBytes());

          boolean bool = signature.verify(arr);

          System.out.println("jdk ecdsa verify:"+bool);

      }catch(Exception e){

      }

  }

}

Java数字签名——ECDSA算法

【方案2】

public class MyTest {

/**

* @param args

*/

public static void main(String[] args) {

new MyTest().getSign();

}

void getSign() {

// Get the instance of the Key Generator with "EC" algorithm

try {

KeyPairGenerator g = KeyPairGenerator.getInstance("EC");

ECGenParameterSpec kpgparams = new ECGenParameterSpec("secp256r1");

g.initialize(kpgparams);

KeyPair pair = g.generateKeyPair();

// Instance of signature class with SHA256withECDSA algorithm

Signature ecdsaSign = Signature.getInstance("SHA256withECDSA");

ecdsaSign.initSign(pair.getPrivate());

System.out.println("Private Keys is::" + pair.getPrivate());

System.out.println("Public Keys is::" + pair.getPublic());

String msg = "text ecdsa with sha256";//getSHA256(msg)

ecdsaSign.update((msg + pair.getPrivate().toString())

.getBytes("UTF-8"));

byte[] signature = ecdsaSign.sign();

System.out.println("Signature is::"

+ new BigInteger(1, signature).toString(16));

// Validation

ecdsaSign.initVerify(pair.getPublic());

ecdsaSign.update(signature);

if (ecdsaSign.verify(signature))

System.out.println("valid");

else

System.out.println("invalid!!!!");

} catch (Exception e) {

// TODO: handle exception

e.printStackTrace();

}

}}

java – 使用secp256r1曲线和SHA256算法生

怎么验证生成的Ecdsa签名是正确的呢,可以看下这篇文章:RSA,ECC,Ecdsa,国密SM2的签名,验签,加密

电子签名用Java怎么实现

import java.security.InvalidKeyException;

import java.security.Key;

import java.security.KeyPair;

import java.security.KeyPairGenerator;

import java.security.NoSuchAlgorithmException;

import java.security.PrivateKey;

import java.security.PublicKey;

import java.security.SecureRandom;

import java.security.Signature;

import java.security.SignatureException;

import java.util.logging.Level;

import java.util.logging.Logger;

/**

 * ECDSA 160bit 签名及签名验证例子

 */

public class ECDSASignature {

    public static void main(String argv[]) {

        signatureTest();

    }

    public static void signatureTest() {

        /**

         * 密钥对生成

         */

        KeyPairGenerator keyPairGenerator = null;

        try {

            keyPairGenerator = KeyPairGenerator.getInstance("EC");

        } catch (NoSuchAlgorithmException ex) {

            return;

        }

        SecureRandom secureRandom = new SecureRandom();

        keyPairGenerator.initialize(160, secureRandom);

        KeyPair pair = keyPairGenerator.generateKeyPair();

        Key publicKey = pair.getPublic();

        Key privateKey = pair.getPrivate();

        // 字符串

        String hako = "test";

        /**

         * 私钥签名(ECDSA 160bit)

         */

        byte[] sign = null;

        try {

            Signature signatureSign = null;

            signatureSign = Signature.getInstance("NONEwithECDSA");

            signatureSign.initSign((PrivateKey) privateKey, secureRandom);

            signatureSign.update(hako.getBytes());

            sign = signatureSign.sign();

            System.out.println("sign: " + new String(sign));

        } catch (InvalidKeyException | NoSuchAlgorithmException | SignatureException ex) {

            Logger.getLogger(ECDSASignature.class.getName()).log(Level.SEVERE, null, ex);

        }

        /**

         * 用公钥进行签名验证

         */

        Signature signatureVerify = null;

        try {

            signatureVerify = Signature.getInstance("NONEwithECDSA");

            signatureVerify.initVerify((PublicKey) publicKey);

            signatureVerify.update(hako.getBytes());

            boolean verifyResult = signatureVerify.verify(sign);

            System.out.println(verifyResult ? "签名OK" : "签名NG");

        } catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) {

            Logger.getLogger(ECDSASignature.class.getName()).log(Level.SEVERE, null, e);

        }

    }

}

Java Platform,Standard Edition7的API有中文版吗

JAVA7 到目前为止还没有中文版的API,不过你下载个java6的看,一般的学习和编程参考基本上就可以了。下面有java7的新特性的介绍,如果你用不到,那么看java6的API可以完全满足需要。

这是Oracle官网的截图:你可以在这下载java7的英文API和java6的中文API。

java7的新特性一览表:

Swing

新增 JLayer 类,是一个灵活而且功能强大的Swing组件修饰器,使用方法:How to Decorate Components with JLayer.

Nimbus Look and Feel 外观从 com.sun.java.swing 包移到 javax.swing 包中,详情:javax.swing.plaf.nimbus

更轻松的重量级和轻量级组件的混合

支持透明窗体以及非矩形窗体的图形界面,请看 How to Create Translucent and Shaped Windows

JColorChooser 类新增 HSV tab.

网络

新增 URLClassLoader.close 方法,请看 Closing a URLClassLoader.

支持 Sockets Direct Protocol (SDP) 提供高性能网络连接,详情请看 Understanding the Sockets Direct Protocol.

集合

新增 TransferQueue 接口,是 BlockingQueue 的改进版,实现类为 LinkedTransferQueue

RIA/发布

拖拽的小程序使用一个默认或者定制的标题进行修饰,详情:Requesting and Customizing Applet Decoration in Draggable Applets.

JNLP 文件做了如下方面的增强,详情请看 JNLP File Syntax:

The os attribute in the information and resources elements can now contain specific versions of Windows, such as Windows Vista or Windows 7.

Applications can use the install attribute in the shortcut element to specify their their desire to be installed. Installed applications are not removed when the Java Web Start cache is cleared, but can be explicitly removed using the Java Control Panel.

Java Web Start applications can be deployed without specifying the codebase attribute; see Deploying Without Codebase

可直接在 HTML 中嵌入 JNLP 文件:Embedding JNLP File in Applet Tag.

可在 JavaScript 代码中检查 Applet 是否已经加载完成:Handling Initialization Status With Event Handlers.

可在 Applet 从快捷方式启动或者拖出浏览器时对窗口样式和标题进行控制:Requesting and Customizing Applet Decoration in Developing Draggable Applets.

XML

包含 Java API for XML Processing (JAXP) 1.4.5, 支持 Java Architecture for XML Binding (JAXB) 2.2.3, 和 Java API for XML Web Services (JAX-WS) 2.2.4.

java.lang 包

消除了在多线程环境下的非层次话类加载时导致的潜在死锁,详情:Multithreaded Custom Class Loaders in Java SE 7.

Java 虚拟机

支持非 Java 语言: Java SE 7 引入一个新的 JVM 指令用于简化实现动态类型编程语言

Garbage-First Collector 是一个服务器端的垃圾收集器用于替换 Concurrent Mark-Sweep Collector (CMS).

提升了 Java HotSpot 虚拟机的性能

Java I/O

java.nio.file 包以及相关的包 java.nio.file.attribute 提供对文件 I/O 以及访问文件系统的全面支持,请看 File I/O (featuring NIO.2).

目录 Java home/sample/nio/chatserver/ 包含使用 java.nio.file 包的演示程序

目录 Java home/demo/nio/zipfs/ 包含 NIO.2 NFS 文件系统的演示程序

安全性

新的内置对多个基于 ECC 算法(ECDSA/ECDH)的支持,详情请看:Sun PKCS#11 Provider's Supported Algorithms in Java PKCS#11 Reference Guide.

禁用了一些弱加密算法,详情请看 Appendix D: Disabling Cryptographic Algorithms in Java PKI Programmer's Guide and Disabled Cryptographic Algorithms in Java Secure Socket Extension (JSSE) Reference Guide.

Java 安全套接字扩展中对 SSL/TLS 的增强

并发

fork/join 框架,基于 ForkJoinPool 类,是 Executor 接口的实现,设计它用来进行高效的运行大量任务;使用 work-stealing 技术用来保证大量的 worker 线程工作,特别适合多处理器环境,详情请看 Fork/Join

目录Java home/sample/forkjoin/ 包含了 fork/join 框架的演示程序

ThreadLocalRandom 类class 消除了使用伪随机码线程的竞争,请看 Concurrent Random Numbers.

Phaser 类是一个新的同步的屏障,与 CyclicBarrier 类似.

Java 2D

一个新的基于 XRender 的 Java 2D 渲染管道支持现在的 X11 桌面,改善了图形性能,请看 System Properties for Java 2D Technology 中的 xrender .

JDK 可枚举并显示出已安装的 OpenType/CFF 字体,通过GraphicsEnvironment.getAvailableFontFamilyNames 方法 See Selecting a Font.

TextLayout 类支持西藏语脚本

libfontconfig, 是一个字体配置 api ,see Fontconfig.

国际化

支持 Unicode 6.0.0

目录 Java home/demo/jfc/Font2DTest/ 包含 Unicode 6.0 的演示程序

Java SE 7 可容纳在 ISO 4217 中新的货币,详情请看 Currency 类.

Java 编程语言特性

二进制数字表达方式

使用下划线对数字进行分隔表达,例如 1_322_222

switch 语句支持字符串变量

泛型实例创建的类型推断

使用可变参数时,提升编译器的警告和错误信息

try-with-resources 语句

同时捕获多个异常处理

JDBC 4.1

支持使用 try-with-resources 语句进行自动的资源释放,包括连接、语句和结果集

支持 RowSet 1.1

参考:

JAVA学习笔记JDK6和7的区别?

新特性一览表:

Swing

新增 JLayer 类,是一个灵活而且功能强大的Swing组件修饰器,使用方法:How to Decorate Components with JLayer.

Nimbus Look and Feel 外观从 com.sun.java.swing 包移到 javax.swing 包中,详情:javax.swing.plaf.nimbus

更轻松的重量级和轻量级组件的混合

支持透明窗体以及非矩形窗体的图形界面,请看 How to Create Translucent and Shaped Windows

JColorChooser 类新增 HSV tab.

网络

新增 URLClassLoader.close 方法,请看 Closing a URLClassLoader.

支持 Sockets Direct Protocol (SDP) 提供高性能网络连接,详情请看 Understanding the Sockets Direct Protocol.

集合

新增 TransferQueue 接口,是 BlockingQueue 的改进版,实现类为 LinkedTransferQueue

RIA/发布

拖拽的小程序使用一个默认或者定制的标题进行修饰,详情:Requesting and Customizing Applet Decoration in Draggable Applets.

JNLP 文件做了如下方面的增强,详情请看 JNLP File Syntax:

The os attribute in the information and resources elements can now contain specific versions of Windows, such as Windows Vista or Windows 7.

Applications can use the install attribute in the shortcut element to specify their their desire to be installed. Installed applications are not removed when the Java Web Start cache is cleared, but can be explicitly removed using the Java Control Panel.

Java Web Start applications can be deployed without specifying the codebase attribute; see Deploying Without Codebase

可直接在 HTML 中嵌入 JNLP 文件:Embedding JNLP File in Applet Tag.

可在 JavaScript 代码中检查 Applet 是否已经加载完成:Handling Initialization Status With Event Handlers.

可在 Applet 从快捷方式启动或者拖出浏览器时对窗口样式和标题进行控制:Requesting and Customizing Applet Decoration in Developing Draggable Applets.

XML

包含 Java API for XML Processing (JAXP) 1.4.5, 支持 Java Architecture for XML Binding (JAXB) 2.2.3, 和 Java API for XML Web Services (JAX-WS) 2.2.4.

java.lang 包

消除了在多线程环境下的非层次话类加载时导致的潜在死锁,详情:Multithreaded Custom Class Loaders in Java SE 7.

Java 虚拟机

支持非 Java 语言: Java SE 7 引入一个新的 JVM 指令用于简化实现动态类型编程语言

Garbage-First Collector 是一个服务器端的垃圾收集器用于替换 Concurrent Mark-Sweep Collector (CMS).

提升了 Java HotSpot 虚拟机的性能

Java I/O

java.nio.file 包以及相关的包 java.nio.file.attribute 提供对文件 I/O 以及访问文件系统的全面支持,请看 File I/O (featuring NIO.2).

目录 Java home/sample/nio/chatserver/ 包含使用 java.nio.file 包的演示程序

目录 Java home/demo/nio/zipfs/ 包含 NIO.2 NFS 文件系统的演示程序

安全性

新的内置对多个基于 ECC 算法(ECDSA/ECDH)的支持,详情请看:Sun PKCS#11 Provider's Supported Algorithms in Java PKCS#11 Reference Guide.

禁用了一些弱加密算法,详情请看 Appendix D: Disabling Cryptographic Algorithms in Java PKI Programmer's Guide and Disabled Cryptographic Algorithms in Java Secure Socket Extension (JSSE) Reference Guide.

Java 安全套接字扩展中对 SSL/TLS 的增强

并发

fork/join 框架,基于 ForkJoinPool 类,是 Executor 接口的实现,设计它用来进行高效的运行大量任务;使用 work-stealing 技术用来保证大量的 worker 线程工作,特别适合多处理器环境,详情请看 Fork/Join

目录Java home/sample/forkjoin/ 包含了 fork/join 框架的演示程序

ThreadLocalRandom 类class 消除了使用伪随机码线程的竞争,请看 Concurrent Random Numbers.

Phaser 类是一个新的同步的屏障,与 CyclicBarrier 类似.

Java 2D

一个新的基于 XRender 的 Java 2D 渲染管道支持现在的 X11 桌面,改善了图形性能,请看 System Properties for Java 2D Technology 中的 xrender .

JDK 可枚举并显示出已安装的 OpenType/CFF 字体,通过GraphicsEnvironment.getAvailableFontFamilyNames 方法 See Selecting a Font.

TextLayout 类支持西藏语脚本

libfontconfig, 是一个字体配置 api ,see Fontconfig.

国际化

支持 Unicode 6.0.0

目录 Java home/demo/jfc/Font2DTest/ 包含 Unicode 6.0 的演示程序

Java SE 7 可容纳在 ISO 4217 中新的货币,详情请看 Currency 类.

Java 编程语言特性

二进制数字表达方式

使用下划线对数字进行分隔表达,例如 1_322_222

switch 语句支持字符串变量

泛型实例创建的类型推断

使用可变参数时,提升编译器的警告和错误信息

try-with-resources 语句

同时捕获多个异常处理

JDBC 4.1

支持使用 try-with-resources 语句进行自动的资源释放,包括连接、语句和结果集

支持 RowSet 1.1

从事java实施应该具备哪些技能?

1、语法:必须比较熟悉,在写代码的时候,IDE(Integrated Development Environment,集成开发环境)的编辑器对某一行报错应该能够根据报错信息知道是什么样的语法错误,并且知道任何修正。

2、命令:必须熟悉JDK(Java Development Kit,Java开发工具箱——JDK 是整个Java的核心,包括了Java运行环境,Java工具和Java基础的类库。JDK是学好Java的第一步。)带的一些常用命令及其常用选项,命令至少需要熟悉:appletviewer、HtmlConverter、jar、 java、javac、javadoc、javap、javaw、native2ascii、serialver,如果这些命令你没有全部使用过,那么你对java实际上还很不了解。

3、工具:必须至少熟练使用一种IDE的开发工具,例如Eclipse、Netbeans、JBuilder、Jdeveloper、IDEA、JCreator或者Workshop,包括进行工程管理、常用选项的设置、插件的安装配置以及进行调试。

4、API(Application Programming Interface,应用程序编程接口):Java的核心API是非常庞大的,但是有一些内容笔者认为是必须熟悉的,否则不可能熟练的运用Java,包括:

◆java.lang包下的80%以上的类的功能的灵活运用;

◆java.util包下的80%以上的类的灵活运用,特别是集合类体系、规则表达式、zip、以及时间、随机数、属性、资源和Timer;

◆java.io包下的60%以上的类的使用,理解IO体系的基于管道模型的设计思路以及常用IO类的特性和使用场合;

◆java.math包下的100%的内容;

◆java.net包下的60%以上的内容,对各个类的功能比较熟悉;

◆java.text包下的60%以上的内容,特别是各种格式化类;

◆熟练运用JDBC. 80%、java.security包下40%以上的内容,如果对于安全没有接触的话根本就不可能掌握java;

◆AWT的基本内容,包括各种组件事件、监听器、布局管理器、常用组件、打印;

◆Swing的基本内容,和AWT的要求类似;

◆XML处理,熟悉SAX、DOM以及JDOM的优缺点并且能够使用其中的一种完成XML的解析及内容处理。

5、测试:Junit测试是程序员测试,即所谓白盒测试。一位合格的Java开发工程师必须熟悉使用junit编写测试用例完成代码的自动测试。

6、管理:必须熟悉使用Ant(中文译为蚂蚁,是一种基于Java的build工具。)完成工程管理的常用任务,例如工程编译、生成javadoc、生成jar、版本控制、自动测试。

7、排错:应该可以根据异常信息比较快速的定位问题的原因和大致位置。

8、思想:必须掌握OOP(Object Oriented Programming,面向对象编程)的主要要求,这样使用Java开发的系统才能是真正的Java系统。

9、规范:编写的代码必须符合流行的编码规范,例如类名首字母大写,成员和方法名首字母小写,方法名的第一个单词一般是动词,包名全部小写等,这样程序的可读性才比较好。

10、博学:掌握J2EE 、Oracle 、WebLogic、Jboss、Spring、Struts、Hibernate 等流行技术,掌握软件架构设计思想、搜索引擎优化、缓存系统设计、网站负载均衡、系统性能调优等实用技术。

ECDSA(椭圆曲线数字签名算法)

ECDSA(Elliptic Curve Digital Signature Algorithm)

在现实工作和生活中,我们使用签名的方式表达对一份文件的认可,其他人可以识别出你的签名并且无法伪造你的签名。数字签名就是对显示签名的一种电子实现,它不仅可以完全达到现实签名的特点,甚至能够做的更好。

常用的数字签名算法有RSA(Rivest-Shamir-Adleman Scheme)、DSS(Digital Signature Standard)等。 比特币使用ECDSA来生成账户的公私钥以及对交易和区块进行验证。

1.Alice(密码学中常用A到Z开头的人名代替甲乙丙丁等,字母越靠后出现频率越低)生成一对密钥,一个是sk(signing key),是非公开的;另一个是vk(verification key),是公开的。

这一对密钥同时生成,并且在数学上是相互关联的,同时,根据vk无法推测出关于sk的任何信息。

2.数字签名算法接收两个输出:信息M和sk,生成一个数字签名Sm

3.验证函数接收信息M、Sm以及vk作为输入,,返回结果是yes或者no。这一步的目的是为了验证你看到的针对信息M的数字签名确实是由Alice的sk来签发的,用于确认信息与签名是否相符。

与手写签名不同,手写签名基本都是相似的,但是数字签名却受输入影响很大。对输入轻微的改变都会产生一个完全不同的数字签名。一般不会对信息直接进行数字签名,而是对信息的哈希值进行签名。由加密哈希函数的无碰撞性可知,这样和对原信息进行签名一样安全。

在数学上,任何满足以下方程的点所形成的曲线称为随机椭圆曲线: 并且 ,a和b可以为任意值。下面展示几个随机椭圆函数的示例:

在了解如何通过基于secp256k1椭圆曲线的ECDSA算法生成公私钥之前,我们需要了解在随机椭圆曲线里,点的加法是如何实现的。

首先定义椭圆曲线上点的加法。设椭圆曲线上有两点,A和B点,那么作过这两点的直线与该曲线相交于第三点(C点),然后关于X轴对称得到D点,则D为这两个点的和,记作D=A+BD=A+BD=A+B。很明显,D点也在该曲线上。所以椭圆曲线上两点之和也是曲线上的点。

特例:

1.如果两点重合,则做该点的切线,与曲线相交点的对称点为和,即A+A=C

如图:

有了加法以后,乘法实现是不过是进行多次加法运算。有了一个基准点P以后,我们可以对其进行乘法运算,最后可以得到曲线上的另外一个点。

设PPP是椭圆曲线上的一个点,那么正整数kkk乘以点PPP的结果由下面的式子定义,注意式子中的加法是上面提到的椭圆曲线上点的加法:

点的运算满足结合律:

很显然,通过累加 的方式计算 是一种很笨的办法,其时间复杂度是线性的。上面我们提到过,椭圆曲线上点的加法是满足结合律的,即 ,扩展一下,就有

于是就有这么一种骚操作,比如计算 ,我们可以先计算 ;然后计算 ;再计算 ;最后计算 。这里我们把15次加法减少到了4次。

当然,k的值不可能总是2的幂。实际上上面的操作可以推广到k为任意正整数的情况。比如计算23P,首先计算 ,然后

因为 ,所以 。总共只需要7次加法。

分析一下,对于任意正整数k,我们都可以利用这个方法将计算k∗P所需的加法计算次数降低到

也就是说,从时间复杂度的角度来看,这个算法是一个 的算法。

这个方法被称为快速幂算法,原本常用于快速计算某个数的k次幂,这里将其推广到椭圆曲线点乘的快速计算中。

为什么要在介绍了椭圆曲线上点的乘法后突然冒出一个快速幂算法?快速幂算法对于椭圆曲线加密有什么意义?因为数学家/密码学家发现,利用快速幂算法计算 的时间复杂度是对数级的,但是要在知道 和 的前提下,倒推出 的值,没有比挨个尝试 的值快太多的算法。于是椭圆曲线加密依赖的数学难题就这么诞生了。

如果我们改一种记法,把椭圆曲线上点的加法记作乘法,原来的乘法就变成了幂运算,那么上述难题的形式跟离散对数问题应该是一致的。即:

所以这个难题叫椭圆曲线上的离散对数问题。

尽管两者形式一致,但是他们并不等价。实际上这个问题比大整数质因子分解(RSA)和离散对数(DH)难题都要难得多,目前还没有出现亚指数级时间复杂度的算法(大整数质因子分解和离散对数问题都有),以致于同样的安全强度下,椭圆曲线加密的密钥比RSA和DH的短不少,这是椭圆曲线加密的一大优势。

假设随机取一个 ~ 位之间的值x,计算 ,最后的结果一定会落在曲线上的一点。假设该点为 ,在公开 以及具体曲线的方程的情况下,能否反推出最初的随机值 ?

证:寻找 的过程只能通过暴力计算, 的可能值为 ~ 中的一个,平均来说需要计算 次能够找到一次 值。那么问题来了,运行一次 的计算需要多长的时间呢?

假设我们使用的是超级计算机,主频为 (一秒钟可以进行一万亿次运算),从宇宙诞生的那一刻开始计算,到现在也就进行了 次。找到 值的概率为 。这个概率和下一秒地球被巨型陨石撞击而毁灭的概率接近,既然我们读到了这里,那么说明这件事没有发生。

在上面的案例中, 是 ~ 位的一个随机数,可以作为私钥。 是随机椭圆曲线上的一个点,也就是由私钥生成的公钥,因此优点可以1得证。

但是密码学中,并不能使用上面介绍的实数域上的椭圆曲线。因为

所以我们需要引入有限域上的椭圆曲线。

要证明优点2,还需要将随机椭圆曲线做一些改动:为了保证最后计算出来的点的坐标值相加是512位,secp256k1引入了一个对质数取模的机制。具体来说,随机椭圆曲线从

变为了 其中 ,是小于 的最大质数。

此时的随机椭圆曲线函数图如下:

具体来说,就是向别人证明我知道 ,但不暴露 的任何信息。(有些类似于零知识证明)

证:前面介绍过结合律: 添加一个hash函数,简单修改可以得出: 使 ,那么可知 为 。此时方程为: 为了简单起见,我们记 和 。此时方程化简为: 上面这个方程是什么意思呢?

可以这样假设:在已知 的情况下,如果能够提供一个 和 满足上面的方程,就可以证明一个人拥有 。这个假设有一个前提,如果一个人不知道x,那么他就无法提供 和 满足上面的等式。

详细探讨这个前提:如果一个人不知道x,又想计算出 和 ,能够办到吗?结论是不能,首先我们无法从 计算出 (在有限时间内)。

还有一个问题:在已知 和 的情况下,能否计算出关于 的任何信息?

根据公式: 只要解出 就可以了。

要想计算出x,就需要知道r,但是在r没有公开的情况下,有什么办法可以计算r吗?我们知道R=r*P;但是根据这个公式无法倒推出r(刚才介绍的那个数学难题),所以x也是安全的。

至此,可以证明算法的第二个优点。

关于java运行ecdsa和JAVA运行环境的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。