Java加密:六、爱德华兹曲线数字签名(EdDSA)算法

一、EdDSA 概述

        在公钥密码学中,爱德华兹曲线数字签名算法( EdDSA ) 是一种数字签名方案,它使用基于扭曲爱德华兹曲线的Schnorr 签名变体。它被设计为比现有的数字签名方案更快而不牺牲安全性。

        在Java中,EdDSA(爱德华兹曲线数字签名算法)[ RFC 8032 ] 是在Java 15中通过JEP 339添加的另一种附加数字签名方案。它不会取代 JDK 中现有的椭圆曲线数字签名算法( ECDSA )。

         在 Apple 最近发布的iOS 安全白皮书中,他们讲述了他们如何在 Apple 生态系统中广泛使用 ECDSA。通过 iMessage 发送的消息使用 ECDSA 进行签名,而 iCloud 钥匙串同步依赖于 ECDSA。越来越多的技术将 ECDSA 用于安全性,包括端到端加密消息服务TextSecure和CryptoCat。

        EdDSA的优势(使用Ed25519)

        1、提供与现有 ECDSA 实施相比性能更好的 EdDSA 独立于平台的实施。

        2、不根据密钥长度改变执行时间。

        3、提供标准化的参数集,例如Ed25519和Ed448,可以使用标识符指定。

        4、它计划与 TLS 1.3 的 JSSE 集成。它是 TLS 1.3 中允许的仅有的三种签名方案之一。

​二、Java EdDSA 示例

        EdDSA提供以下参数

算法名称
描述
EDDSA
RFC 8032 中定义的 Edwards-Curve 签名算法
Ed25519
RFC 8032 中定义的 Ed25519 的 Edwards-Curve 签名算法
Ed448
RFC 8032 中定义的 Ed448 的 Edwards-Curve 签名算法

        下面给出了一个代码示例,说明如何在 Java 程序中使用 EdDSA 算法来加密字符串。

//EdDSA 示例
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.util.Base64;
 
public class EdwardAlgoExample {
  public static void main(String[] args)
      throws NoSuchAlgorithmException, InvalidKeyException, SignatureException {
 
    KeyPairGenerator kpg = KeyPairGenerator.getInstance("Ed25519");
    KeyPair kp = kpg.generateKeyPair();
 
    byte[] msg = "test_string".getBytes(StandardCharsets.UTF_8);
 
    Signature sig = Signature.getInstance("Ed25519");
    sig.initSign(kp.getPrivate());
    sig.update(msg);
    byte[] s = sig.sign();
 
    String encodedString = Base64.getEncoder().encodeToString(s);
    System.out.println(encodedString);
  }
}

        程序输出如下

O+FQIdJylUF0GW//O+gVGmsAwGDQBuCZkULqgQdpvj

H3koFL3wpSrwN1zzjgWOGLXtyDFrJxvwD1J7rIIY+AAw==

三、ECDSA 与 RSA

        当 RSA 可用并且自1977年以来一直是非对称加密的标准,为什么ECDSA是新协议的首选算法?归根结底,专家们和相关组织在破解RSA方面比在破解ECC方面做得更好。

        密钥的安全性取决于其大小和算法。有些算法比其他算法更容易破解,并且需要更大的密钥才能获得相同的安全级别。破解 RSA 密钥需要您考虑一个很大的数字。随着硬件的进步以及量子计算的出现,我们越来越擅长分解大量数字。破解ECDSA密钥需要您解决椭圆曲线离散对数问题 (ECDLP)。自从 Koblitz 和 Miller 在 1985 年独立引入以来,数学界在改进算法以解决这个问题方面没有取得任何重大进展。

        这意味着使用 ECDSA,可以获得与 RSA 相同级别的安全性,但密钥更小。由于几个原因,较小的键比较大的键更好。较小的密钥具有更快的生成签名的算法,因为数学涉及较小的数字。更小的公钥意味着更小的证书和更少的数据来建立 TLS 连接。这意味着更快的连接和更快的网站加载时间。

四、相关参考

RFC 8032 - Edwards-Curve Digital Signature Algorithm (EdDSA)https://datatracker.ietf.org/doc/html/rfc8032
https://en.wikipedia.org/wiki/EdDSAhttps://en.wikipedia.org/wiki/EdDSA

猜你喜欢

转载自blog.csdn.net/bashendixie5/article/details/124220315