2013-03-28 5 views
0

저는 암호화/해독 루틴에 관한 초보자입니다. DCPCrypt를 사용하여 암호화 된 문자열의 암호를 해독하기 위해 Lockbox3을 내 응용 프로그램으로 이동하려고합니다.DCPCrypt to Lockbox3 이전

function TfrmMain.Encrypt(value: string): string; 
var 
    CipherR : TDCP_rijndael; 
    m, sm, Key, IV: string; 
    Data: string; 
begin 
    Key := PadWithZeros(m, KeySize); 
    IV := PadWithZeros(sm, BlockSize); 
    Data := PadWithZeros(value, BlockSize); 
    m := 'SOMEWORDSOMEWORD'; 
    sm := 'WORDSOMEWORDSOME'; 

    Key := PadWithZeros(m, KeySize); 
    IV := PadWithZeros(sm, BlockSize); 
    CipherR := TDCP_rijndael.Create(Self); 
    if Length(m) <= 16 then 
    CipherR.Init(Key[1], 128, @IV[1]) 
    else if Length(m) <= 24 then 
    CipherR.Init(Key[1], 192, @IV[1]) 
    else 
    CipherR.Init(Key[1], 256, @IV[1]); 
    CipherR.EncryptCBC(Data[1], Data[1], Length(Data)); 
    CipherR.Free; 
    FillChar(Key[1], Length(Key), 0); 
    code := Base64EncodeStr(Data); 
    Result := code; 
end; 

내가 Lockbox3를 사용하여이 방법을 암호화 된 문자열을 해독하는 지금 싶습니다,하지만 난 m와 SM 등의 암호화 기능에 사용 된 값을 사용해야하며, 내가 알고 내가 어떻게 할 수 있습니다 의 내가 암호화이 기능을 있다고 가정 해 봅시다 내가 할 수 있다면 그렇게해라. sm 값을 사용하여 Codec1.Password를 설정한다고 생각했지만 작동하지 않습니다.

아이디어가 있으십니까? 모든 조언을 주셔서 감사합니다. 대한

답변

0

어떻게 ...

function TfrmMain.Encrypt(const value: string): string; 
var 
    Codec: TCodec; 
    Lib : TCyptographicLibrary; 
    Ciphertext: ansistring; 
begin 
Codec := TCodec.Create(nil); 
Lib := TCyptographicLibrary.Create(nil); 
Codec.CryptoLibrary := Lib; 
Codec.StreamCipherId := BlockCipher_ProgId; 
Codec.BlockCipherId := 'native.AES-256'; // AES-256 cipher 
Codec.ChainModeId := CBC_ProgId;   // CBC chaining 
Codec.Password := 'WORDSOMEWORDSOME'; 
Codec.EncryptString(Value, Ciphertext); // Assumes UNICODE supporting compiler. 
result := Ciphertext; // Implicit utf8string --> unicode string coersion here. 
Codec.Burn; 
Lib.Free; 
Codec.Free; 
end; 

function TfrmMain.ShowCiphertextOfSomeWords; 
begin 
ShowMessage('base64 of ciphertext = ' + Encrypt('SOMEWORDSOMEWORD')) 
end; 

이 모든

은 번들 데모 프로그램과 온라인 도움말에 표시됩니다. 번들로 제공되는 데모 프로그램과 온라인 도움말은 처음 참조해야합니다. 응답자는 이미 귀하의 이익을 위해 작성된 것을 반복하는 경향이 있으므로 Stackoverflow 또는 포럼에 가기 전에이를 검토하십시오.

+0

나는 명확하지 않은 것을 두려워합니다. 내 문제는 'SOMEWORDSOMEWORD'문자열을 암호화하지 않습니다. DCPCrypt를 사용하여 위의 함수를 사용하여 문자열을 암호화했습니다. DCPCrypt를 사용하면 Key와 IV라는 두 가지 값을 설정해야합니다 (스 니펫 참조). 암호를 해독하려면 Key와 IV에 동일한 값을 사용해야하며 암호 해독은 올바르게 작동합니다. 이제 Lockbox3으로 마이그레이션 할 때까지 기다렸다가 Lockbox를 사용하여 DCPCrypt로 암호화 된 동일한 문자열을 해독해야하지만 Lockbox에서 암호를 설정할 수 있습니다 (Key 또는 IV의 동일한 값이므로 생각합니다). 그러나 어떻게 사용하는지 모르겠습니다. 다른 값. – Marco

+0

자신의 IV와 열쇠에서 시작하는 경우, 당신이 요구하는 것은 할 수 없습니다. 확실히 다른 방법으로 갈 수는 있지만 DCPcrypt는 LB3으로 암호화 된 문자열의 암호를 해독합니다. LB3은 암호를 해시 (SHA1)하여 2 진 키를 제조합니다. 암호화 할 때 LB3은 임의의 64 비트 번호 (넌스)를 생성합니다. 이 난스는 0으로 확장되어 IV로 사용됩니다. nonce는 출력 스트림 앞에 추가됩니다. LB3가 해독되면, 넌스가 픽업되어 IV를 형성하기 위해 추가됩니다. IV에 관한 한, IV를 붙이면 LB3에서 암호를 해독 할 수 있습니다.하지만 이것은 높은 암호가있는 경우에만 작동합니다 ... –

+0

... DCPcrypt IV의 64 비트가 0입니다. 또한 바이너리 키를 암호 문자열로 변환하는 문제가 남아 있습니다. DCPcrypt 암호화 방법을 제어 할 수있게 허용하면 문제가 해결 될 수 있지만 문제는 현재 해결되어 있으므로 해결할 수 없습니다. –