자바와 C++ 암호화 복호화 해보신분
자바(안드로이드)에서 데이터를 암호화해서 c++로 보내주고 c++에서 복호화하려고합니다.
자바쪽 코드입니다.
public static void main(String[] args) {
// TODO Auto-generated method stub
encryp ec=new encryp();
String name="abcd1234";
System.out.println(name);
try {
System.out.println(ec.encrypt(name));
System.out.println(ec.decrypt(ec.encrypt(name)));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class encryp {
static byte []key=new byte[]{0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00};
public static String encrypt(String message) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(message.getBytes());
return byteArrayToHex(encrypted);
}
c++입니다
extern "C"{
#include "libcrypt\aes.h"
} //*/
#include
#include
#include
#include
using namespace std;
void main(){
aes_context ctx;
WCHAR *in=L"abcd1234";
WCHAR *out;
// WCHAR *secret_key=L"abcdefgh12345678";
BYTE secret_key[]={0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00};
BYTE * buf=(BYTE*)malloc(18);
BYTE * keybuff=(BYTE*)malloc(16);
memset(buf,0, 18);
memset(keybuff,0,16);
memcpy( buf, in, 15);
memcpy( keybuff, secret_key, 16);
aes_set_key( &ctx, keybuff, 128);
aes_encrypt( &ctx, buf, buf );
out=(WCHAR*)buf;
for (int i = 0 ; i < 16 ; ++i)
std::cout << std::hex << static_cast(buf[i]);
std::cout << std::endl;
aes_decrypt( &ctx, buf, buf );
out=(WCHAR*)buf;
MessageBox(NULL, (WCHAR*)out, NULL, 0); //*/
system("pause");
}
각각 암복호화는 잘 되는데 서로 같은 값을 암호화했을 때 값이 다르게 나옵니다.
모드라던지 패딩같은 것들을 맞춰줘야할 것 같은데 c++에서 위 libcrypt(crypto++?) 라이브러리를 썼을 때 어떤 식으로 매칭시켜줘야하나요?
저는 이거 보고 했습니다.
http://cdecl.tistory.com/277
저희가 사용했던 방법
간단한 방법으로는
OpenSSL 기반으로 SSL 기반 Client/Server Socket Program을 짜서 테스트 한 후에
Java 족에 OpenSSL을 JNI로 Import 했던 기억이 있네요.
Dig it.
getBytes 의 encoding 을 확인해보시는게 좋겠군요.
Android 는 해본 적 없지만 검색해보니 default encoding 이 UTF-8 이라고 나오네요.
C++ 는 Windows 에서 한 것 같은데 WCHAR 을 쓴 것을 보면 UTF-16 인가요?
용량처리도 잘못하신 것 같고... aes_encrypt 와 aes_decrypt 를 어떻게 하셨는지 모르겠습니다만 padding 처리도...
값은 다르게 나오나 자바에서 암호화 한것을 c++
값은 다르게 나오나 자바에서 암호화 한것을 c++ 복호화 하면 같은 문자가 나오고
c++에서 암호화 한것을 반대로 자바에서 복호화 하여도 같은 결과가 나타납니다.
결과는 같습니다
값은 다르게 나오나 자바에서 암호화 한것을 c++ 복호화 하면 같은 문자가 나오고
c++에서 암호화 한것을 반대로 자바에서 복호화 하여도 같은 결과가 나타납니다.
댓글 달기