C\#자바 Rsa 와 암호 화 및 복호화
20144 단어 자바
키 설명:C\#(.net)에서 키 를 내 보 내 는 세 가지 방법 이 있 습 니 다.하 나 는 blob 이 고 하 나 는 xml 이 며 다른 하 나 는 매개 변수 입 니 다.그 중에서 xml 방식 은 매개 변 수 를 xml 직렬 화 하 는 것 입 니 다.blob 형식 은 무슨 뜻 인지 모 르 겠 습 니 다.문서 에서 마이크로소프트 에 어떤 api 를 사용 하 는 지 만 알 고 있 습 니 다.다음은 매개 변 수 를 보 여 주 는 형식 입 니 다.
RSAParameters 필드
Contains
대응 하 는 PKCS\#1 필드
D
d,비밀 키 지수
privateExponent
DP
d mod (p - 1)
exponent1
DQ
d mod (q - 1)
exponent2
Exponent
e,공개 키 지수
publicExponent
InverseQ
(InverseQ)(q) = 1 mod p
coefficient
Modulus
n
modulus
P
p
prime1
Q
q
prime2
RSA 알고리즘
키 쌍 을 만 들 려 면 p 와 q 라 는 두 개의 큰 질 수 를 만 드 는 것 부터 시작 할 수 있 습 니 다.이 두 수 를 곱 하면 결 과 는 n 이 라 고 부른다.p 와 q 는 모두 질 수 이기 때문에 n 의 모든 인 수 는 1,p,q 와 n 이다.
n 보다 작은 숫자 만 고려 하면 n 과 호 질 수(즉 n 과 공약수 가 없 음)의 개 수 는(p-1)(q-1)와 같다.
현재,하나의 수 e 를 선택 하 십시오.그것 은 계 산 된 값 과 상호 질량 수 입 니 다.공개 키 는{e,n}을 표시 합 니 다.
비밀 키 를 만 들 려 면 d 를 계산 해 야 합 니 다.(d)(e)mod n=1 을 만족 시 키 는 숫자 입 니 다.유클리드 알고리즘 에 따 르 면 비밀 키 는{d,n}입 니 다.
일반 텍스트 m 에서 암호 텍스트 c 까지 의 암호 화 는 c=(m^e)mod n 으로 정의 합 니 다.복호화 는 m=(c^d)mod n 으로 정의 합 니 다.
한 마디 로 하면.net 의 rsa 에서 적당 한 키 설명 을 받 을 수 있 습 니 다.자바 에 대해 서도 할 수 있 을 것 같 습 니 다.그리고 보통 키 는 키 용기 에 두 어야 합 니 다.
이제.net 으로 하나 만 들 겠 습 니 다. rsa 키 를 16 진법 으로 출력 합 니 다(new RSACrypto ServiceProvider,키 내 보 내기 만 하면 됩 니 다)
D: 2FE7479CF4CFEE63218C44D763C3E552DC5FBC94A31F944B88AE8E58F0ED16874B8BED35307B143F413761B2ECFFC95F48DF0D0A29FC155C0B968EFE9FFF36E7
DP: 6777B761BC29637622FC63682243BB2E05CCFC6FF710ADE1DCE6B0C843B17C4F
DQ: 68771CCDA40F0DA0B504C438BB03F7DF30F77364094D475E70270D148260D247
Exponent: 010001
InverseQ: 5665AB47697008CC2CECB544B582B9C50628281C400846C1E736629B03FE5C85
Modulus: B3F276C8EDF515FD3248CCF4163480B9F77443A666522D66B89411EC6DFE11DEA917A97C977750EE777DACBD4D2C11BC363FDC110E5CCA0A1361D51AFA4A7ADD
P: ECC60A01B1BDCBA1C5422D8A0A34FC0E46727DB4ED5089E54C356F052E0AB573
Q: C28F233948483D0CD0E3FA7B5D2955F2B15E831B38876FB0E7180D873EDF7A6F
.net 코드 를 쓰기 편 하도록 blob 키 를 붙 입 니 다.
0702000000A40000525341320002000001000100DD7A4AFA1AD561130ACA5C0E11DC3F36BC112C4DBDAC7D77EE5077977CA917A9DE11FE6DEC1194B8662D5266A64374F7B9803416F4CC4832FD15F5EDC876F2B373B50A2E056F354CE58950EDB47D72460EFC340A8A2D42C5A1CBBDB1010AC6EC6F7ADF3E870D18E7B06F87381B835EB1F255295D7BFAE3D00C3D484839238FC24F7CB143C8B0E6DCE1AD10F76FFCCC052EBB43226863FC22766329BC61B7776747D26082140D27705E474D096473F730DFF703BB38C404B5A00D0FA4CD1C7768855CFE039B6236E7C14608401C282806C5B982B544B5EC2CCC08706947AB6556E736FF9FFE8E960B5C15FC290A0DDF485FC9FFECB26137413F147B3035ED8B4B8716EDF0588EAE884B941FA394BC5FDC52E5C363D7448C2163EECFF49C47E72F
비밀 키 이기 때문에 암호 화 와 복호화 가 동시에 가능 합 니 다.아래 위. C\#코드,비교적 간단 합 니 다.
using System;
using System.Security.Cryptography;
class Program
{
public static void Main(string[] args)
{
byte[] plainText = new byte[]{0,1,2,3,4,5};
byte[] cipherText;
byte[] key = String2Bytes("0702000000A40000525341328001000001000100D3D10816051881319774576B67B1D24F3AA303471A4402AB625208EC1CB04D508AF2098227C5EE185890ECB83E6971C12BDCF4F8AB0FD729167C815D3404C1AD1C0628E3544C89E9F9044A6869447310C72D7CDEB5E3582AB28BCC5069D60CD4AB5A1BB8C754AEB544FA65FB990ADB68F5AA37D7AC2CCDBF19058A2A4CF18FC29577D184E75EFD0ABEC1263893262F40C89AB2831B20B52B477770BA95FA02A71339911EBBF8630AD1AEECC205888440037D580B18AEF11FC5F35EB74E434E5A9302823BF795A34DADDFE0C6D55BC7997E667ADBE511BA06");
using(var rsa = new RSACryptoServiceProvider())
{
rsa.ImportCspBlob(key);
Console.WriteLine("OAEP:");
Console.WriteLine(Bytes2String(rsa.Encrypt(plainText, true)));
Console.WriteLine("PCSK1-v1_5:");
Console.WriteLine(Bytes2String(rsa.Encrypt(plainText, false)));
}
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
const string pattern = @"[^0-9a-fA-F]+";
static byte[] String2Bytes(string str)
{
str = System.Text.RegularExpressions.Regex.Replace(str, pattern, "");
if (str == string.Empty)
return null;
byte[] data = new byte[str.Length / 2];
for (int i = 0; i < data.Length; ++i)
data[i] = byte.Parse(str.Substring(2 * i, 2), System.Globalization.NumberStyles.HexNumber);
return data;
}
static string Bytes2String(byte[] data)
{
System.Text.StringBuilder builder = new System.Text.StringBuilder();
foreach (var element in data) {
builder.AppendFormat("{0:X2}",element);
}
return builder.ToString();
}
}
실행 후 출력(rsa 암호 화,비밀문서 가 매번 같 지 않 음):
OAEP:87F04B0F28B81D23E63DA71C8278E0B7E357F40583BDDCAB493D44A58080EB178EC8E0DB0DCD4BE5427FDB8190229B8DF2511BDA1082607C92BD03B0615D5AD3PCSK1-v1_5:358AB4D336D0C35DAE3895E8A125F4F5AD0FB58117A4100FAF15DE95FF8615F01FFB1A59C9B579792B7C14E93E54A3E7E236D464DDB93D8DF9D96F63F46BACD7
지금 우 리 는 비밀문서 가 생 겼 습 니 다.......................................................................
다음은 자바 의 복호화 부분 을 쓰 겠 습 니 다.
package rsatest;
import java.math.BigInteger;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.RSAPrivateKeySpec;
import java.security.spec.RSAPublicKeySpec;
import javax.crypto.Cipher;
public class RsaTest {
public static void main(String[] args) throws Exception {
// 0, 0,
BigInteger n = new BigInteger("B3F276C8EDF515FD3248CCF4163480B9F77443A666522D66B89411EC6DFE11DEA917A97C977750EE777DACBD4D2C11BC363FDC110E5CCA0A1361D51AFA4A7ADD", 16);
BigInteger e = new BigInteger("010001", 16);
BigInteger d = new BigInteger("2FE7479CF4CFEE63218C44D763C3E552DC5FBC94A31F944B88AE8E58F0ED16874B8BED35307B143F413761B2ECFFC95F48DF0D0A29FC155C0B968EFE9FFF36E7", 16);
RSAPublicKeySpec keySpec = new RSAPublicKeySpec(n, e);
PublicKey publicKey = KeyFactory.getInstance("RSA").generatePublic(keySpec);
RSAPrivateKeySpec prvKeySpec = new RSAPrivateKeySpec(n, d);
PrivateKey privateKey = KeyFactory.getInstance("RSA").generatePrivate(prvKeySpec);
// key ,
byte[] oaepCiphertext = Hex2Bytes("87F04B0F28B81D23E63DA71C8278E0B7E357F40583BDDCAB493D44A58080EB178EC8E0DB0DCD4BE5427FDB8190229B8DF2511BDA1082607C92BD03B0615D5AD3");
// OAEP
Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPPADDING");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] plaintext = cipher.doFinal(oaepCiphertext);
System.out.println(Bytes2Hex(plaintext));
// PKCS1-v1_5
byte[] ciphertext = Hex2Bytes("358AB4D336D0C35DAE3895E8A125F4F5AD0FB58117A4100FAF15DE95FF8615F01FFB1A59C9B579792B7C14E93E54A3E7E236D464DDB93D8DF9D96F63F46BACD7");
cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
plaintext = cipher.doFinal(ciphertext);
System.out.println(Bytes2Hex(plaintext));
}
public static byte[] Hex2Bytes(String hexStr) {
if (hexStr.length() % 2 != 0) {
hexStr = "0" + hexStr;
}
byte[] bytes = new byte[hexStr.length() / 2];
for (int i = 0; i < bytes.length; ++i) {
bytes[i] = (byte) Integer.parseUnsignedInt(hexStr.substring(i * 2, i * 2 + 2), 16);
}
return bytes;
}
public static String Bytes2Hex(byte[] bytes) {
StringBuilder builder = new StringBuilder();
for (byte b : bytes) {
builder.append(String.format("%02X", b));
}
return builder.toString();
}
}
프로그램 실행 후 출력:
000102030405000102030405
우리 가 예 상 했 던 것 과 같다.
우 리 는 자바 로 명문 암호 화,코드 세 션 을 다시 사용 합 니 다.
// plaintext {0,1,2,3,4,5}
cipher = Cipher.getInstance("RSA/ECB/OAEPPADDING");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
oaepCiphertext = cipher.doFinal(plaintext);
System.out.println("OAEP:");
System.out.println(Bytes2Hex(oaepCiphertext));
cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
ciphertext = cipher.doFinal(plaintext);
System.out.println("PCSK1-v1_5:");
System.out.println(Bytes2Hex(ciphertext));
대응 하 는 출력(rsa 암호 화,비밀문서 가 매번 같 지 않 음):
OAEP:3144C4CB06C7F49D31E65D09C840069F7CCF602487908CCEAB33D473B949199E1795530B69E1FA20EB59E392B2B934024D46E979DEA1682BDFA61D6FDD980F9CPCSK1-v1_5:699A694BEB75616879C6B8D311CC10D987EA109D494EE6C9380CD2C02A124613F130C440CB1CA6D3405E50B62CF96A79EB43C3370253E5D8C1A9132CFE01D686
다음은 C\#로 데이터 복호화,코드 세 션
// rsa
//OAEP
cipherText = String2Bytes("3144C4CB06C7F49D31E65D09C840069F7CCF602487908CCEAB33D473B949199E1795530B69E1FA20EB59E392B2B934024D46E979DEA1682BDFA61D6FDD980F9C");
Console.WriteLine(Bytes2String(rsa.Decrypt(cipherText, true)));
//PCSK1-v1_5
cipherText = String2Bytes("699A694BEB75616879C6B8D311CC10D987EA109D494EE6C9380CD2C02A124613F130C440CB1CA6D3405E50B62CF96A79EB43C3370253E5D8C1A9132CFE01D686");
Console.WriteLine(Bytes2String(rsa.Decrypt(cipherText, false)));
대응 하 는 출력:
000102030405000102030405
복호화 에 도 성 공 했 습 니 다.
어쩌면 골 치 아 픈 문 제 는 이미 알 고 있다 는 것 일지 도 모른다. {혹은 {d,n}.net 에서 사용 하 는 키 를 어떻게 생 성 합 니까?
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.