2009-03-18 2 views
0

맨 먼저 Java 프로그래머가 아닙니다. 내가 가진 자바 개발자는 암호화 작업에 많은 경험이 없기 때문에이 문제에 대한 예제 솔루션을 찾고있다. 우리가 온라인에서 찾은 모든 것은 웹 페이지를 암호화하고 MS 키 저장소를 다루는 것과 관련이 있습니다. 우리는 PowerBuilder (PB)의 단일 문자열로 작업하고 자바로 해독 할 수 있습니다. 여기서 제한은 MS 라이브러리입니다. 특정 제한 사항으로 인해 우리는이 암호화 방법을 사용하는 데 어려움을 겪었으므로 Java에 따라 달라 지므로 처리 할 수 ​​없습니다.예제가 필요합니다 - Microsoft Crypto API를 사용하여 Java에서 문자열 해독

내가 갖고있는 PB 버전 10.2 프로그램은이 Java 유틸리티를 호출하고 사용자 이름 & 암호를 전달해야합니다. 우리는 PB가 자바 애플리케이션을 호출하는 방법 인 것처럼 명령 행에 친숙한 문자열로 패스워드를 암호화하려고 시도하고있다. 코드가하고있는 무엇 http://www.topwizprogramming.com/freecode_crypto.html

은 advapi32.dll의 발견은 Microsoft 암호화 API를 포장한다 :

는 PB에서 나는 다음과 같은 개체를 사용하고 있습니다. 그것을 사용하는 기능은 다음

CryptAcquireContext http://msdn.microsoft.com/en-us/library/aa379886(VS.85).aspx

수 CryptCreateHash http://msdn.microsoft.com/en-us/library/aa379908(VS.85).aspx

CryptHashData http://msdn.microsoft.com/en-us/library/aa380202(VS.85).aspx

CryptDeriveKey http://msdn.microsoft.com/en-us/library/aa379916(VS.85).aspx

CryptEncrypt

Microsoft Strong Cryptographic Provider 및 PROV_RSA_FULL을 사용하고 있습니다. 코드는 데이터를 암호화하여 BLOB로 변환 한 다음 암호화 함수로 전달합니다. 거기에서, 컨텍스트 acuires, 컨텍스트에서 해시 개체를 만들고, 해시, 비밀 번호 해시에서 세션 키를 가져옵니다 다음 암호화/해독을 호출합니다. 마지막으로 반환 된 BLOB를 ANSI 문자 집합 아래의 문자열로 변환합니다.

일부에서 온 한 눈에 이해 상수의 숫자, 순전히 다른 사람이 있습니다 상수 문자열 KEY_CONTAINER는 = "MyKeyContainer" 상수 ULONG PROV_RSA_FULL = 1 상수 ULONG CALG_MD5 = 32771 상수 ULONG CALG_RC4 = 26625 상수 ULONG ENCRYPT_ALGORITHM = CALG_RC4 상수 ULONG CRYPT_NEWKEYSET = 8 상수 ULONG ERROR_MORE_DATA = 234

이 난 상관 없어 MS의 썬 암호화 인터페이스 BouncyCastle 같은 1.6을 사용하여 1.5에서 수행 여부, 우리 이 일을보고 싶어 죽겠다. 우리 머리를 아프게합니다.


안녕하세요. 문자열을 암호화하고 파일을 저장해야하며 파일을 다시 읽고 동일한 문자열을 해독해야합니다. 하지만 전체 파일을 암호화하고 싶지 않습니다. 일단 내가 파일에 저장된 필요한 crypted 값을 가지고, 나는 혼자 원래의 문자열로 변환해야합니다. 샘플 코드로 도와 주실 수 있습니까?

+0

당신이하려는 일이 명확하지 않습니다. 이 암호화 프로세스를 Java로 복제 하시겠습니까? Java로이 프로세스로 암호화 된 일부 데이터의 암호를 해독 하시겠습니까? 원하는 Java 코드의 필수 기능을 설명하십시오. – erickson

+0

또한 설명하는 암호화를 복제하거나 되돌리려면 예상되는 입력과 출력을 가진 몇 가지 테스트 사례가 있어야합니다. – erickson

+0

내가 쓴 것은 모든 PB 관련 구성 요소에서 찾을 수있는 관련 정보 (모든 것)입니다. 따라서 누군가가 내가 자바 측에서 작동하도록 노력하고 있는지 알 수 있습니다. 내가 어떻게 말할 지 모르겠다. 암호화 된 문자열을 생성하는 PB 응용 프로그램이 있고 Java에서 해당 문자열의 암호를 해독해야합니다. –

답변

4
import java.security.GeneralSecurityException; 
import java.security.MessageDigest; 

import javax.crypto.Cipher; 
import javax.crypto.spec.SecretKeySpec; 

public class Decrypt 
{ 

    public static void main(String... argv) 
    throws Exception 
    { 
    byte[] password = "password".getBytes("UTF-8"); 
    byte[] ciphertext = { -68, -112, 66, 78, 85, 50, 22, -63, 
          16, 24, -45, 4, -116, -14, 88, 34, 
          -85, 116, 105, 59, 45, -126 }; 
    byte[] plaintext = decrypt(password, ciphertext); 
    System.out.println(new String(plaintext, "UTF-8")); 
    } 

    public static byte[] decrypt(byte[] password, byte[] ciphertext) 
    throws GeneralSecurityException 
    { 
    MessageDigest digest = MessageDigest.getInstance("MD5"); 
    byte[] hash = digest.digest(password); 
    Cipher rc4 = Cipher.getInstance("RC4"); 
    rc4.init(Cipher.DECRYPT_MODE, new SecretKeySpec(hash, "RC4")); 
    return rc4.doFinal(ciphertext); 
    } 

} 

N.B.:

"암호화"는 끔찍합니다. RC4는 키 스트림 암호입니다. 둘 이상의 메시지에 동일한 키 스트림 암호 키를 사용하지 마십시오! 여러 메시지에 대해 이와 같은 암호를 사용하면 여러 암호 텍스트가있는 일반 텍스트와 키를 복구하는 것이 쉽습니다. MD5의 약점을 감안할 때, 아마도 암호를 복구 할 수 있습니다. 이러한 결함으로 인해 양호한 스트림 암호가 손상 될 수 있지만 MD5와 같은 RC4에는 자체 취약성이 있으므로 새로운 응용 프로그램에는 권장되지 않습니다.

필자는 모든 것을 알고 있고 기존 응용 프로그램에 의해 제약을 받았지만 다른 사람들이이 대답을 보는 경우 사용을 강요당하는 PowerBuilder "crypto"라이브러리가 부적절하게 구현되었음을 이해해야합니다. 암호 입력 및 출력 이후


텍스트 인코딩 일반적 등 (예를 들면베이스 (64) 또는베이스 (85) 암호문 텍스트 지향 채널을 통해 통과함에 따라 사용되며, 항상 "바이너리"인 명령 행). 가능한 경우 Java 유틸리티를 호출하기 전에 Base-64로 암호화 텍스트를 인코딩 할 수 있습니까? 그러면 문자 인코딩 문제로부터 당신을 보호 할 수 있습니다.

+0

감사합니다. erickson.이 시점에서 유일한 문제는 문자 집합입니다 .Cp1252로 인수를 변환하면 99가됩니다. 거기에 원래 데이터의 공백이있는 일부 콤보가 우리에게 쓰레기를줍니다. 우리는 다른 wa 이것에 대처하는 ys. 매우 감사합니다. –

관련 문제