2017-04-13 1 views
1

Blowfish ECB 암호화를 cipherMode 0, 출력 1과 함께 사용해야하는 클라이언트가 있습니다.이 문제를 해결하기 위해 노력했지만 막혔습니다. 코드를 수정하려면 어떻게해야합니까?Blowfish C# 구현의 ECB 암호화

알고리즘 : 여기

전체 클라이언트 명령입니다 복어 · 모드 : ECB · 패딩 : 우리는 ECB 모드를 사용하기 때문에 * 초기 벡터를 PKCS5Padding를하는 것은 불필요하다.

· 키 암호화 : 3280 : 2fs5uhnjcnpxcpg9 일반 텍스트 → 99 : 암호 텍스트 → 20120201123050 : daa745f1901364c0bd42b9658db3db96336758cd34b2a576 는 * 16 개 진수 문자로 암호 텍스트를 보관하십시오. * "salt"없이 암호문을 생성하십시오.

이 내용을 C#으로 작성해야합니다. 여기에 내가 무슨 짓을했는지,하지만 그것은 작동하지 않는 것 :

string member_id = "3280"; 
     string panelType = "99"; 
     string RandomString = "20120201123050"; 
     string encryptionKey = "2fs5uhnjcnpxcpg9"; 
     string cryptstr = member_id + ":" + panelType + ":" + RandomString; 
     string plainText = cryptstr; 
     BlowFish b = new BlowFish(encryptionKey); 
     string cipherText = b.Encrypt_ECB("3280:99:20120201123050"); 

결과는 daa745f1901364c0bd42b9658db3db96336758cd34b2a576 없습니다. 나는 어디로 잘못 갔는가?

+2

와우, 그건 최악의 보안 현명한 얘기입니다! Blowfish의 저자조차도 더 이상 사용하지 않습니다. 이제 그는 AES를 사용합니다. ECB 모드를 사용하지 마십시오. 안전하지 않습니다. [ECB 모드] (https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Electronic_Codebook_.28ECB.29)에서 펭귄까지 스크롤하십시오. – zaph

+0

Blowfish 클래스를 가져 오기 위해 가져 오는 것은 무엇입니까? 그리고 패딩을위한 설정을 보지 못했기 때문에, Blowfish 클래스가 들어있는 라이브러리의 doc이 사용한다고 말하는 기본값은 무엇입니까? –

+0

결국 보안을 업데이트 할 때가되었습니다. AES는 15 년 동안 사용할 수 있었고, 클라이언트는 실제로 15 년을 기다리는 노력을해야합니다. 어리석은 일이었습니다. – zaph

답변

1

Encrypt_ECB() 그래서 나는 Schneier의 클래스를 가정합니다.

BlowFish b = new BlowFish(Encoding.UTF8.GetBytes(encryptionKey)); 

출력은 여전히 ​​수정되지 않고, 정말 자신의 예를 해독으로해야 무엇을 볼 수 있습니다 :

의 ctor 하나가 전달되는 경우, 당신은 바이트 배열에 대한 과부하를 필요로 16 진수 문자열을 기대한다 :

string clear = b.Decrypt_ECB("daa745f1901364c0bd42b9658db3db96336758cd34b2a576"); 

우리를 제공합니다

좋지만있다
"3280:99:20120201123050\u0002\u0002" 

2 0 x2 바이트가 끝나면 N x 0xN은 PKCS 패딩으로 인한 것입니다. 일치를 얻으려면 입력을 덧붙일 필요가 있습니다.

// input to bytes 
List<byte> clearBytes = new List<byte>(Encoding.UTF8.GetBytes("3280:99:20120201123050")); 

// how many padding bytes? 
int needPaddingBytes = 8 - (clearBytes.Count % 8); 

// add them 
clearBytes.AddRange(Enumerable.Repeat((byte)needPaddingBytes, needPaddingBytes)); 

// encrypt 
byte[] cipherText = b.Encrypt_ECB(clearBytes.ToArray()); 

// to hex 
string cipherTextHex = BitConverter.ToString(cipherText).Replace("-", "").ToLowerInvariant();