`
lobin
  • 浏览: 417791 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

RSA

 
阅读更多

 

公钥长度读写

 

 

读取长度:

this.length = DerInputStream.getLength(i & 0xFF, paramInputStream);

 

static int getLength(int paramInt, InputStream paramInputStream)
  throws IOException
{
  int j = paramInt;    int i;
  if ((j & 0x80) == 0) {
    i = j;
  } else {
    j &= 127;



    if (j == 0)
      return -1;
    if ((j < 0) || (j > 4)) {
      throw new IOException("DerInputStream.getLength(): lengthTag=" + j + ", " + ((j < 0) ? "incorrect DER encoding." : "too big."));

    }

    for (i = 0; j > 0; --j) {
      i <<= 8;
      i += (0xFF & paramInputStream.read());
    }
  }
  return i;
}

 

写入长度:

public void putLength(int paramInt)
  throws IOException
{
  if (paramInt < 128) {
    write((byte)paramInt);
  }
  else if (paramInt < 256) {
    write(-127);
    write((byte)paramInt);
  }
  else if (paramInt < 65536) {
    write(-126);
    write((byte)(paramInt >> 8));
    write((byte)paramInt);
  }
  else if (paramInt < 16777216) {
    write(-125);
    write((byte)(paramInt >> 16));
    write((byte)(paramInt >> 8));
    write((byte)paramInt);
  }
  else {
    write(-124);
    write((byte)(paramInt >> 24));
    write((byte)(paramInt >> 16));
    write((byte)(paramInt >> 8));
    write((byte)paramInt);
  }
}

 

Java PKCS8EncodedKeySpec & X509EncodedKeySpec

 EncodedKeySpec

java.security.spec.EncodedKeySpec

 

PKCS8EncodedKeySpec

私钥的ASN.1编码(规范),编码按照PKCS#8标准:

 

PrivateKeyInfo ::= SEQUENCE {
  version Version,
  privateKeyAlgorithm PrivateKeyAlgorithmIdentifier,
  privateKey PrivateKey,
  attributes [0] IMPLICIT Attributes OPTIONAL }

Version ::= INTEGER

PrivateKeyAlgorithmIdentifier ::= AlgorithmIdentifier

PrivateKey ::= OCTET STRING

Attributes ::= SET OF Attribute

 

 

X509EncodedKeySpec

公钥的ASN.1编码(规范),编码按照X.509标准:

 

SubjectPublicKeyInfo ::= SEQUENCE {
  algorithm AlgorithmIdentifier,
  subjectPublicKey BIT STRING }

 

 

String privateKey = "MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEApTHMs+zR16SE0v3npoVbMGo70xX5tJ7HF23SvM2rARkJNtRs4xZRQpWQ1JBZnGna9HcVQsrRAORqYhhTrZ9rMQIDAQABAkAFNrlYrasZErJGQEEiIWP9lwHCvZchLTB4j+TahIV+2iLTiLa21QOqQFmpBqw/uqmHsJGtqtHIXdtgCrGtoLVhAiEA4zpbZ52vkCskvZ2eJ34n6dTsiybZLIMYIdp21kd6mpECIQC6HJ2f0R6BwL/ORYhF6tA1YeXZEKyAuTgDkwgmGN/WoQIgPsXrZHeafbB9iOiXPX/LlPyekF6eFn7s1sVcmRvMEhECIBnJDS2vU4K2qdxyVccaGW7L+YRxgvTytIgKPv7IQ3sBAiEAh3XrxyuR3nJhFD5pPcRLmnst9Ag6WQuthc/SgkKJlXk=";
String publicKey = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKUxzLPs0dekhNL956aFWzBqO9MV+bSexxdt0rzNqwEZCTbUbOMWUUKVkNSQWZxp2vR3FULK0QDkamIYU62fazECAwEAAQ==";

byte[] privateKeyEncoded = Base64.base64ToByteArray(privateKey);
byte[] publicKeyEncoded = Base64.base64ToByteArray(publicKey);

 

// 加密
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(privateKeyEncoded);
KeyFactory keyFactory = null;
try {
    keyFactory = KeyFactory.getInstance("RSA");
} catch (NoSuchAlgorithmException e) {
    Assert.fail("no such algorithm: " + e.getMessage());
}

PrivateKey privateKey = null;
try {
    privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
} catch (InvalidKeySpecException e) {
    Assert.fail("invalid key spec: " + e.getMessage());
}
System.out.println("private key: " + Base64.byteArrayToBase64(((Key) privateKey).getEncoded()));

 

// 解密
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(publicKeyEncoded);
try {
    keyFactory = KeyFactory.getInstance("RSA");
} catch (NoSuchAlgorithmException e) {
    Assert.fail("no such algorithm: " + e.getMessage());
}
PublicKey publicKey = null;
try {
    publicKey = keyFactory.generatePublic(x509KeySpec);
} catch (InvalidKeySpecException e) {
    Assert.fail("invalid key spec: " + e.getMessage());
}
System.out.println("public key: " + Base64.byteArrayToBase64(((Key) publicKey).getEncoded()));

 

完整代码

/**
 * private key: MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEApTHMs+zR16SE0v3npoVbMGo70xX5tJ7HF23SvM2rARkJNtRs4xZRQpWQ1JBZnGna9HcVQsrRAORqYhhTrZ9rMQIDAQABAkAFNrlYrasZErJGQEEiIWP9lwHCvZchLTB4j+TahIV+2iLTiLa21QOqQFmpBqw/uqmHsJGtqtHIXdtgCrGtoLVhAiEA4zpbZ52vkCskvZ2eJ34n6dTsiybZLIMYIdp21kd6mpECIQC6HJ2f0R6BwL/ORYhF6tA1YeXZEKyAuTgDkwgmGN/WoQIgPsXrZHeafbB9iOiXPX/LlPyekF6eFn7s1sVcmRvMEhECIBnJDS2vU4K2qdxyVccaGW7L+YRxgvTytIgKPv7IQ3sBAiEAh3XrxyuR3nJhFD5pPcRLmnst9Ag6WQuthc/SgkKJlXk=
 * public key: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKUxzLPs0dekhNL956aFWzBqO9MV+bSexxdt0rzNqwEZCTbUbOMWUUKVkNSQWZxp2vR3FULK0QDkamIYU62fazECAwEAAQ==
 */
@Test
public void test11() {
    String privateKey = "MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEApTHMs+zR16SE0v3npoVbMGo70xX5tJ7HF23SvM2rARkJNtRs4xZRQpWQ1JBZnGna9HcVQsrRAORqYhhTrZ9rMQIDAQABAkAFNrlYrasZErJGQEEiIWP9lwHCvZchLTB4j+TahIV+2iLTiLa21QOqQFmpBqw/uqmHsJGtqtHIXdtgCrGtoLVhAiEA4zpbZ52vkCskvZ2eJ34n6dTsiybZLIMYIdp21kd6mpECIQC6HJ2f0R6BwL/ORYhF6tA1YeXZEKyAuTgDkwgmGN/WoQIgPsXrZHeafbB9iOiXPX/LlPyekF6eFn7s1sVcmRvMEhECIBnJDS2vU4K2qdxyVccaGW7L+YRxgvTytIgKPv7IQ3sBAiEAh3XrxyuR3nJhFD5pPcRLmnst9Ag6WQuthc/SgkKJlXk=";
    String publicKey = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKUxzLPs0dekhNL956aFWzBqO9MV+bSexxdt0rzNqwEZCTbUbOMWUUKVkNSQWZxp2vR3FULK0QDkamIYU62fazECAwEAAQ==";

    byte[] privateKeyEncoded = Base64.base64ToByteArray(privateKey);
    byte[] publicKeyEncoded = Base64.base64ToByteArray(publicKey);

    String message = "13120983870";
    System.out.println(message);

    encryptAndDecrypt(message, privateKeyEncoded, publicKeyEncoded);
}

 

private void encryptAndDecrypt(String message, byte[] privateKeyEncoded, byte[] publicKeyEncoded) {
    // 加密
    PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(privateKeyEncoded);
    KeyFactory keyFactory = null;
    try {
        keyFactory = KeyFactory.getInstance("RSA");
    } catch (NoSuchAlgorithmException e) {
        Assert.fail("no such algorithm: " + e.getMessage());
    }

    PrivateKey privateKey = null;
    try {
        privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
    } catch (InvalidKeySpecException e) {
        Assert.fail("invalid key spec: " + e.getMessage());
    }
    System.out.println("private key: " + Base64.byteArrayToBase64(((Key) privateKey).getEncoded()));

    Cipher cipher = null;
    try {
        cipher = Cipher.getInstance(keyFactory.getAlgorithm());
    } catch (NoSuchAlgorithmException e) {
        Assert.fail("no such algorithm: " + e.getMessage());
    } catch (NoSuchPaddingException e) {
        Assert.fail("no such padding: " + e.getMessage());
    }
    try {
        cipher.init(Cipher.ENCRYPT_MODE, privateKey);
    } catch (InvalidKeyException e) {
        Assert.fail("invalid key: " + e.getMessage());
    }

    byte[] encryption = null;
    try {
        encryption = cipher.doFinal(message.getBytes());
    } catch (IllegalBlockSizeException e) {
        Assert.fail("illegal block size: " + e.getMessage());
    } catch (BadPaddingException e) {
        Assert.fail("bad padding: " + e.getMessage());
    }
    System.out.println("encryption: " + Base64.byteArrayToBase64(encryption));

    // 解密
    X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(publicKeyEncoded);
    try {
        keyFactory = KeyFactory.getInstance("RSA");
    } catch (NoSuchAlgorithmException e) {
        Assert.fail("no such algorithm: " + e.getMessage());
    }
    PublicKey publicKey = null;
    try {
        publicKey = keyFactory.generatePublic(x509KeySpec);
    } catch (InvalidKeySpecException e) {
        Assert.fail("invalid key spec: " + e.getMessage());
    }
    System.out.println("public key: " + Base64.byteArrayToBase64(((Key) publicKey).getEncoded()));
    try {
        cipher = Cipher.getInstance(keyFactory.getAlgorithm());
    } catch (NoSuchAlgorithmException e) {
        Assert.fail("no such algorithm: " + e.getMessage());
    } catch (NoSuchPaddingException e) {
        Assert.fail("no such padding: " + e.getMessage());
    }
    try {
        cipher.init(Cipher.DECRYPT_MODE, publicKey);
    } catch (InvalidKeyException e) {
        Assert.fail("invalid key: " + e.getMessage());
    }

    byte[] decryption = null;
    try {
        decryption = cipher.doFinal(encryption);
    } catch (IllegalBlockSizeException e) {
        Assert.fail("illegal block size: " + e.getMessage());
    } catch (BadPaddingException e) {
        Assert.fail("bad padding: " + e.getMessage());
    }
    System.out.println("decryption: " + new String(decryption) + ", base64:" + Base64.byteArrayToBase64(decryption));
}

 

 

 

 

 

  • 大小: 13.6 KB
0
1
分享到:
评论

相关推荐

    RSA签名验签工具windows_V1.4.zip_rsa_rsa2生成签名_rsa签名工具_工具_验签

    RSA签名验签工具是用于处理数字签名的一种实用软件,尤其在网络安全和电子商务中扮演着重要角色。这个名为“RSA签名验签工具windows_V1.4.zip”的压缩包包含了一个适用于Windows操作系统的工具,版本为V1.4,专门...

    rsa2048.rar_RSA2048_RSA2048加密算法_rsa2048.rar_rsa_2048_site:www.pu

    RSA2048是一种基于公钥密码体制的加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,是目前广泛使用的一种非对称加密技术。在这个标题和描述中,我们关注的是2048位的RSA算法,它在加密解密过程中...

    RSA和RSA2签名算法区别.md

    ### RSA与RSA2签名算法的区别 #### 数字签名概述 数字签名是一种确保数据完整性和验证发送者身份的技术手段。在实际应用中,数字签名通常包括两个步骤:摘要和非对称加密。首先,通过对需要签名的数据进行摘要处理...

    rsa2048.rar RSA2048的C语言实现代码

    在本文中,我们将深入探讨RSA2048的C语言实现及其相关知识点。 1. RSA算法基础: RSA算法由Ron Rivest、Adi Shamir和Leonard Adleman于1977年提出,它是一种非对称加密算法,意味着加密和解密使用不同的密钥。RSA...

    RSA算法演示RSA算法演示

    RSA算法是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因此得名RSA。这种算法在信息安全领域有着广泛的应用,如数字签名、数据加密和密钥交换等。在本演示中,我们将深入探讨RSA...

    RSA解密RSA解密

    RSA算法是一种非对称加密算法,它是现代密码学的基石之一,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年共同提出,因此得名RSA。这种算法基于大数因子分解的困难性,使得只有拥有特定密钥的人才能对数据进行...

    C#RSA加密DEMO

    C# 是一种广泛使用的编程语言,它提供了丰富的库来支持各种加密算法,其中包括RSA(Rivest-Shamir-Adleman)加密。RSA是一种非对称加密算法,它的特点是拥有两个密钥:公钥和私钥,分别用于加密和解密。 在这个"C# ...

    RSA.rar_1024 RSA_2048位RSA_rsa_rsa-2048_rsa加密算法

    RSA加密算法是公钥密码学领域中的一个经典算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因此得名RSA。它基于大整数因子分解的困难性,为数据通信提供安全的加密手段。在本压缩包文件中,我们可能...

    Delphi RSA加解密【支持RSA公钥加密私钥解密,RSA私钥加密公钥解密,秘钥格式支持PKCS8和PKCS1】D7~XE10可用

    在IT领域,特别是软件开发中,安全通信是至关重要的,而RSA算法是广泛使用的非对称加密技术之一。本文将详细讲解Delphi环境下如何实现RSA加解密,并着重讨论其支持的公钥加密私钥解密以及私钥加密公钥解密的功能,...

    rsa共模攻击_rsa共模攻击_pythonrsa共模_rsa攻击方式_rsapython_rsa共模_

    RSA算法是一种非对称加密算法,它基于大数因子分解的困难性,广泛应用于网络安全领域,如数字签名、数据加密等。然而,RSA系统并非无懈可击,其中一种潜在的攻击方式就是“共模攻击”(Common Modulus Attack)。在...

    RSA离线签名工具

    RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,广泛应用于网络安全领域,包括数字签名、数据加密以及身份验证等。在这个场景中,"RSA离线签名工具"是一个专门用于生成和验证RSA数字签名的软件。下面我们将深入...

    rsa2048签名算法

    RSA2048签名算法是一种基于非对称加密技术的数字签名方法,广泛应用于网络安全、数据完整性保护以及身份验证等领域。在本文中,我们将深入探讨RSA2048签名算法的原理、工作流程以及其在实际应用中的重要性。 RSA...

    Delphi RSA 加密解密签名验签控件 RSA_Component(1.0.0.0).rar

    RSA加密演算法是一种非对称加密演算法。在公开密钥加密和电子商业中RSA被广泛使用。 典型的应用 1. 苹果App签名, iOS App 签名的原理; 2. 支付宝签名验证 ; 2. HTTPS 加密连接; 3. 程序直接用RSA+AES加密通信 ...

    RSA的jar包,js和RSA的java工具类

    这个压缩包包含与RSA相关的JAR包、JavaScript文件以及Java工具类,主要用于在JSP应用中实现密码的加密和解密。以下是对这些资源及其在实际应用中的作用的详细解释。 1. RSA算法原理: RSA基于数论中的大数因子分解...

    VC++实现RSA算法

    RSA算法是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因其发明者的名字首字母而得名。在VC++中实现RSA算法需要理解其核心原理,包括大整数运算、素数检测、欧拉函数以及模逆运算...

    rsa.zip_RSA 公钥加密_rsa_rsa私钥加密

    RSA算法是一种非对称加密算法,它在信息安全领域有着广泛的应用,特别是在数据传输的安全性上。这个zip压缩包“rsa.zip”显然包含了关于RSA加密算法的实现,可能是一个C语言编写的程序“ras.c”。在这里,我们将深入...

    RSA2048签名代码

    RSA2048签名代码是基于著名的非对称加密算法RSA的一种应用,主要用来实现数据的数字签名。在这个C语言实现的项目中,开发者提供了一个完整的解决方案,旨在帮助熟悉C语言的用户理解并运用RSA2048签名机制。下面我们...

    RSA加密解密工具,用于文件的加密和解密* RSA加密解密:私钥解密,公钥加密

    RSA算法是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,是目前广泛应用于网络安全领域的一种核心加密技术。它的主要特点是拥有两个密钥:公钥和私钥。公钥可以公开,用于加密信息;...

    RSA公私钥生成工具 RSA秘钥生成工具

    RSA算法是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,是目前应用最广泛的公开密钥加密技术。该算法基于大数因子分解的数学难题,使得加密过程相对简单,但破解极其困难。 在RSA...

    RSA-delphi7-XE.rar_delphi rsa_delphixe RSA256_libeay32.pas_xe 10

    RSA算法是一种非对称加密算法,它在信息安全领域有着广泛的应用,如数字签名、数据加密等。这个"RSA-delphi7-XE.rar"压缩包包含了用Delphi编程语言实现的RSA算法,适用于Delphi XE版本。Delphi是Embarcadero ...

Global site tag (gtag.js) - Google Analytics