`
lobin
  • 浏览: 425569 次
  • 性别: 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...

    C#RSA加密DEMO

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

    易语言 rsa加密 易语言 rsa加密易语言 rsa加密

    易语言 rsa加密 易语言 rsa加密易语言 rsa加密

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

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

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

    rsa2048签名算法

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

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

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

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

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

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

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

    RSA.rar_RSA算法_寻找大素数 rsa_数论算法_简单数论

    RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。...

    RSA签名算法,PKCS7格式

    本资源包含:RSA签名算法,格式为PKCS7。RSA签名算法,格式为PKCS7。RSA签名算法,格式为PKCS7。RSA签名算法,格式为PKCS7。 RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。RSA是1977...

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

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

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

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

Global site tag (gtag.js) - Google Analytics