WinCrypt RSA 및 Java org.bouncycastle

세르지오 Pv :

여기 질문이 있습니다. Windows 시스템에는 짧은 문자열을 사용하고 공개 RSA 키를 사용하여 CryptEncrypt를 작성하는 오래된 코드가 있습니다. 최소 작업 예는 다음과 같습니다 (단축 확인을 피하십시오. 해제 방지)

std::string testData = "12345678";
HCRYPTPROV context;
CryptAcquireContext(&context, nullptr, nullptr, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_SILENT);

auto pubK = FromBase64(PublicKey);
CERT_PUBLIC_KEY_INFO *pubKeyInfo = nullptr;
DWORD keyLength = 0;
CryptDecodeObjectEx(X509_ASN_ENCODING, X509_PUBLIC_KEY_INFO, 
    pubK.data(), pubK.size(), 
    CRYPT_ENCODE_ALLOC_FLAG, nullptr, 
    &pubKeyInfo, &keyLength);

HCRYPTKEY key;
CryptImportPublicKeyInfo(context, X509_ASN_ENCODING, pubKeyInfo, &key);

std::vector<std::uint8_t> result(testData.begin(), testData.end());
DWORD size = testData.size();

CryptEncrypt(key, NULL, true, 0, result.data(), &size, result.size());
result.resize(size);
size = testData.size();
CryptEncrypt(key, NULL, true, 0, result.data(), &size, result.size());

std::cout << ToBase64(result) << "\n";

코드가 작동하고 base64로 인코딩 된 문자열을 반환합니다. 처럼 lTq01sOcgDcgwtDaFFoHH/Qb6xLw0KU+/n/+3t0eEb8l4N69QGcaEWf1qso3a4qn7Y8StlXcfMe8uspNF/KDj6qQOMvCuM+uUl+tkLd5NXiESsjycgjyxAqdCIO71iTSmsYVcsS3fY/gtIbO4UAFnCRPOXoSyqWqpXW7IRtFzL2N3MxgIBlIMErNvNWs5HPA7xAY/XO6UpSMWsQO4ppccdeNLSZDPwOxohKD/BX5oDin81nFn7fvIZgghfH5knF1nezK8IGKl+vtbgrwlUUULp/wJ4POceyIn0HaZoVsaCu6xFJcUJGfBqSvm4GZqkp2MlGxBODku0OSgEfIDEGMTg==.

그런 다음 java를 실행하는 다른 쪽의 개인 키로이 문자열을 해독해야합니다. bouncycastle을 사용합니다.

    try {
        Security.addProvider(new BouncyCastleProvider()); 
        String value = "";
        AsymmetricKeyParameter privateKey = 
            (AsymmetricKeyParameter) PrivateKeyFactory.createKey(Base64.getDecoder().decode(privateKeyValue));
        AsymmetricBlockCipher e = new RSAEngine();
        e = new org.bouncycastle.crypto.encodings.PKCS1Encoding(e);
        e.init(false, privateKey);

        byte[] messageBytes = Base64.getDecoder().decode(inputdata);
        byte[] hexEncodedCipher = e.processBlock(messageBytes, 0, messageBytes.length);
        value = new String(hexEncodedCipher);
        System.out.println(value);
        return value;
    }
    catch (Exception e) {
        System.out.println(e);
    }

그리고이 코드는 다음 오류를 보여줍니다.

org.bouncycastle.crypto.DataLengthException: input too large for RSA cipher.

Java 측에서 동일한 키를 사용하고 동일한 공개 키로 동일한 데이터를 암호화하면 해독이 예상대로 작동하기 때문에 Windows 측에서 무언가가 누락되었다고 생각합니다.

여기 에이 질문 (RSA 2048)에 대해 openssl로 생성 한 키 :
개인 :

MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCeL7K++3+vl52Q
WFC6ThgvNPlhHLlP5ylIMi/7Gy60wcCHtx8R5Hzi2j7Kx/uBXyr7SCbePS7NtqHx
meVK3VhEvYHz2uYaUNf6GqJgNNjfRymnL5ll8K8lq1wym6A7KZ+L3qLHH1oI6GfW
+uf32nUfy1PQvsatPN7aiJ4ymiaJj2LcI6Bp78CINsu56Cx9QBN9uoXqKO/7NjOz
y2GRdYdckiqCkcmGDzA4/5tJROxj21gUbxwoUR+yz2sVFGlcJycsDDJiIXiPjbVN
XgM/YfmRjdAPQQwXXj9AK5w/dp9TPq621WqYES74rIY05cba4v1kihmFbs0DHLrV
fQZB0Pu9AgMBAAECggEAGuD//nO9vpiErYJUNVQPx/W4akf3NRySZzIf9QspZI2H
qYf0P5YTonhzMwHIOrNxGkGoWRsMWOgvnF4KGC6EUSniaw1HDDGwgU8FSFOyhj4R
VddAuZGsMTps8CyBjYwFED9EaZFqOxlCi8UWpYb5X+2s0EuadtVhCMEuIGsRIU53
mfW11182YtbAI7Zqi7wg/w0yRz5rVj4ph8nbSFPgi6qtVWA9bxVxNeRTXyQDWjUU
NFQzGcRG6D/SYTnRzTndVM5TmTwEVt0hvJNA2/pMWF5XMu6B2exOpJIVVVdQ40l/
XHh33SU8+gQYY56rHzFebCa0Nuxwdk0paluv+x3CAQKBgQDKwe8QXfNlMDqrM06n
iq/NwKE7tB+1gs1nKr4qZdbI71IzgQJgIJcxbJwbuE6z6Yk8PoancEELH9mSY7EN
YGeSO3QsO1LF1vyJWgWQU1G3pfC9sh8sY6f9WYg8+JogIeJsgjwf7PXrGaBq8++Q
GBMUATzPAh/ERIqUip0nEQ2IJwKBgQDHuYgPvv77qhLc+ZNOdhaZtibeVsFx50V+
a+qR+INSTJ/CChNkoVtMg803ZQWckJBOYL/TS2Mw+ctNomUg+ImjULGT9GzqMeme
HkPpAj5pNyNVpRfVNZfmS2cwwuRyE1QbFGs3C4p7D5MKKCfl4/8MBQXtJGWrQZFr
owh2NNyHewKBgHsMmSYorlcBnwlZOOnK7AiFWBRgq0G/4SI0OXaHmYMWYp+pMqTe
AoPXMyJLh0/+ce/izlt9b6vtp2AFKmVA1XpUpJtXYVN5tocw3+GH/zbh+SlWmT6a
OFAz7s953CeWCNDrdMu3RkNoqQdfhUrAoYtpeNr0ogy9wBCH0vnrinfPAoGBALNy
U/hpz+lH1qjqKFsPqKC001ljM21msL60sU4zrbHNHKEXsnLwsvodVc3Wm2MfVDjH
nrJ2gomnde2r4hbsl6W/w70+mHkXHWKuqK97D54zJzE1IyOygmctCmr6QIzqJuAp
yWbsnKCSzrcKe0aHQkmHXdrCoAJt5/2AvwKN3jJvAoGAIaLts1F7shIZ365FXyWD
poOFtXsNRXESkcYpJ2Pn+K0fUNtdH4BtR/5Z5bsEWXBf2LbL7s15UZFZbck0KH3K
22BRgPQze7wEhMVFlIMNhF17WrOh2NTGUAVz2CYSthbYh0QSI+5XJk0AEfiQcqYk
+E4bZw/RUTY94V+ITEK6F8g=

공공의

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAni+yvvt/r5edkFhQuk4Y
LzT5YRy5T+cpSDIv+xsutMHAh7cfEeR84to+ysf7gV8q+0gm3j0uzbah8ZnlSt1Y
RL2B89rmGlDX+hqiYDTY30cppy+ZZfCvJatcMpugOymfi96ixx9aCOhn1vrn99p1
H8tT0L7GrTze2oieMpomiY9i3COgae/AiDbLuegsfUATfbqF6ijv+zYzs8thkXWH
XJIqgpHJhg8wOP+bSUTsY9tYFG8cKFEfss9rFRRpXCcnLAwyYiF4j421TV4DP2H5
kY3QD0EMF14/QCucP3afUz6uttVqmBEu+KyGNOXG2uL9ZIoZhW7NAxy61X0GQdD7
vQIDAQAB

내가 뭘 잘못 했니?

토 파코 :

CryptEncrypt리틀 엔디안 형식 의 암호문을 리턴합니다 CryptEncrypt(비고, 마지막 섹션) . 자바에서 해독하기 messageBytes위해서는 바이트 배열을 뒤집어 야한다 (예 : here) .

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

iText / BouncyCastle ClassNotFound org.bouncycastle.asn1.DEREncodable 및 org.bouncycastle.tsp.TimeStampTokenInfo

JSEncrypt를 사용한 RSA 암호화 및 BouncyCastle (Java)을 사용한 암호 해독

C ++ 및 WinCrypt 라이브러리를 사용한 RSA 암호화 및 C #을 사용한 암호 해독

Bouncycastle-기본 RSA 대 RSA

org.bouncycastle.tls.crypto.TlsCertificate getSubject () 및 기타 게터

Java 및 .NET Interop on (RSA) 서명

itext7 java.lang.NoClassDefFoundError : org.bouncycastle.asn1.esf.SignaturePolicyIdentifier

java.lang.ClassNotFoundException : org.bouncycastle.asn1.ASN1Encodable

원인 : java.lang.NoClassDefFoundError : org / bouncycastle / asn1 / ASN1ObjectIdentifier

Java 패키지가 없습니다 (패키지 org.bouncycastle.cms).

bouncycastle 및 iText 버전

Java 6 및 BouncyCastle을 사용하는 Jboss 5.1.0 GA의 TLSv1.2

안드로이드 java.lang.NoClassDefFoundError가 : org.bouncycastle.crypto.engines.AESEngine API를 (16)

java.lang.LinkageError org.bouncycastle.mail.smime.SMIMESignedGenerator.generate(Ljavax/mail/internet/MimeBodyPart;) 해결 방법

RSA 암호화 및 복호화 Java

bouncycastle-java 및 RSAES-OAEP를 사용한 암호화/복호화

Bouncycastle 공급자 및 Java SUN 공급자 상호 운용성 문제

RSA Java 불만 사항 서명 및 확인

Java (Android)에서 RSA 키 서명 및 확인

C # 및 Java 사이의 RSA 상호 운용성

RSA는 Java와 Go 간의 암호화 및 암호 해독

C # BouncyCastle-공개 / 개인 키를 사용한 RSA 암호화

java.security.Signature와 MessageDigest 및 Cipher와 함께 SHA1 및 RSA 사용

Bouncycastle을 사용하여 Java에서 암호화 및 해독을위한 Gost 28147-89 알고리즘 구현

BouncyCastle (java) 및 Gcrypt (C)를 사용하여 암호화하면 다른 결과가 제공됩니다.

.NET ECDiffieHellmanCng 및 BouncyCastle Core 호환 계약

BouncyCastle로 ECDSA 서명 및 Crypto ++로 확인

org.bouncycastle.asn1.DLSequence는 org.bouncycastle.asn1.ASN1Integer로 캐스팅 할 수 없습니다.

스레드 "main"java.lang.VerifyError의 예외 : org.bouncycastle.asn1.ASN1Primitive 클래스가 최종 메소드 equals를 재정의합니다. (Ljava / lang / Object;) Z

TOP 리스트

뜨겁다태그

보관