Microsoft MVP성태의 닷넷 이야기
글쓴 사람
우라미윰 (herestayme0401 at nate.com)
홈페이지
첨부 파일
(연관된 글이 1개 있습니다.)

우선 저희쪽 상황을 보자면 우리(A) 상대 (b)

A라는 업체쪽에 xml문서로 보내고 리턴값을 요청을 하면 B라는 업체가 그것을 받아 들여 결과값을 리턴하는 형식으로 진행을 하고 있습니다.

그런데 어느날 중요한 값들은 보안 문제 때문에 암호화 하라는 것입니다.

일단 저희는 c#으로 구현을 해야하는 상황이고 그쪽은 java로 구현을 마친 상태입니다.

우선 보낼 값 values1, values2, values3 이 있다고 하면 이값들은 RijndaelManaged rijndkey = new RijndaelManaged(); 를 이용하여 대칭키를 생성하고 암호화 작업을 거칩니다.
이게 1차 작업입니다. 여기까지는 A와 B의 대칭 알고리즘으로 암복호화가 잘 이루어 집니다.

헌데 대칭키를 values4 값에 B업체가 제공한 공개키값으로 암호화를 해서 보내야 한다는 점입니다.

B는 개인키를 이용하여 values4값을 복호화 하고 복호화 하게 대면 대칭키를 알게 될것이고 그키값으로 values1, values2, values3 을 복호화 하는 작업을 하는 것이지요.


---------------------B업체의 JAVA암호화 소스 -------------------------

//공개키 파일로부터 byte[] 추출.
File publicKeyFile = new File(“MATI의 공개키가 저장 된 파일경로");
FileInputStream fis = new FileInputStream(publicKeyFile);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int theByte = 0;
while((theByte = fis.read()) != -1){
baos.write(theByte);
}
fis.close();
byte[] publicKeyBytes = baos.toByteArray();
baos.close();

//공개키 생성.
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(keySpec);

//RSA 암호화 사이퍼 생성.
Cipher rsaCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
rsaCipher.init(Cipher.ENCRYPT_MODE, publicKey);

//MATI 의 공개키로 세션키(대칭키) 암호화 수행. ---- rijndaelKey = 세션키
byte[] encryptedSessionKeyBytes = rsaCipher doFinal(rijndaelKey getEncoded());

---------------------A업체의 C# 암호화 소스 -------------------------
               
                //공개키 파일로 부터 byte[] 추출
    1 string filepath = "D:\\MatiPublicKey.key"; //b업체가 준 공개키 정보가 들어있는 키파일입니다.
                         
    2 FileStream fsSource = new FileStream(filepath, FileMode.Open, FileAccess.Read);
    3 int size = (int)fsSource.Length;
    4 byte[] bytes = new byte[size];
    5 size = fsSource.Read(bytes, 0, size);
    6 byte[] Exponent = { 1, 0, 1 };
    7 string nknk = Convert.ToBase64String(bytes);
    8 byte[] from64key = Convert.FromBase64String(nknk);

    9 //x509 인증서생성하여 공개키를 객체화 시킨다.
    10 X509Certificate2 x509 = new X509Certificate2(from64key);
    11 RSA rsa = (RSA)x509.Publickey;
                       
    12 ////공개키 파라미터 적용
    13 RSAParameters RSAKeyInfo = rsa.ExportParameters(false);
    14 RSAKeyInfo.Modulus = RSAKeyInfo.Modulus;
    15 RSAKeyInfo.Exponent = RSAKeyInfo.Exponent;
                

    16 //공개키 알고리즘 생성
    17 RSACryptoServiceProvider oEnc = new RSACryptoServiceProvider();
    18 oEnc.ImportParameters(RSAKeyInfo);
               
    19 //암호화
    20 byte[] inbuf = Convert.FromBase64String(_deakey); //_deakey 가 대칭키입니다.
    21 byte[] encbuf = oEnc.Encrypt(inbuf, false);

    22 //암호화된 문자열 Base64인코딩
    23 return Convert.ToBase64String(encbuf);

--------------------------------------------------------------------------------------------------------
문제는 10번라인 입니다.
저 부분에서 익셉션에러가 발생하면서 "요청된 개체를 찾을 수 없습니다." 라고 나옵니다. 물론 생성자 값에 bytes 도 같은 결과이며 x.509.import역시 같은 결과가 나옵니다.

"X509EncodedKeySpec는 (바이트 [] encodedKey) 주어진 인코딩 된 키를 사용하여 새로운 X509EncodedKeySpec를 만듭니다."
자바의 생성자 내용입니다.


"X509Certificate2(Byte[])    바이트 배열의 정보를 사용하여 X509Certificate2 클래스의 새 인스턴스를 초기화합니다."
이건 c#의 생성 내용 이구요.

 자바는 인코딩 된 키를 사용하고 c#은 바이트 배열을 사용한다는 부분이 걸리는데
여기서 더이상 손을 댈수가 없습니다. 제 지식의 한계를 느낍니다.ㅠㅠ
내일까지가 기한이긴 한데 해결못하면 주말 출근해야할지도 모릅니다.ㅠㅠ


혹시나 해서 키 파일도 첨부해서 드립니다.
개인키는 업체가 공개하기좀 껄끄럽다고 합니다.ㅡㅡ; 키만 바꾸면 되는데 어이가 없더라구여..


r+KVnANae8w8Rmf+0p/5bciAAzlUkgPS/rk2XIflees= 대칭키

VKM4FSUPjh31j8QlUt1Bg9/dssLtGg1AUf+umY62VQcYJFo0OLjoyw7alcPATjACIlNJullCFQUqKhpHGMnd5FjisfoUcKHjGvOQOszvH2IXMnNae2UTxQSMDHwhK7i6NMrynBX/Wv16VvVzVJ0HTuCDrqXZ27YRRSkgxfvudF8= b업체가 공개키를 이용하여 대칭키를 암호화한 값(tobase64)

Aey8Z3i+kgCiPaJdl62X022BaaR+gWFC2UBu1x5Kvsb9d1gni0PR2GF48Ux6CwRVVRVGRwjyW7tMQxoh0fAGV1XBMbcyWdzEu7Jmi+j+cNaaaoWF/BxtHYd4cN4sRK2/b4ELM8yDr3nicgEw3fXsRYJ0eXNGcOX+MTwPwuPRgXv9hJHsCcW4SZNhY/DV7wCCksKnpVo00vg9RXkBUfgfPsO7

RSAParameters RSAKeyInfo = new RSAParameters();
RSAKeyInfo.Modulus = bytes; 이방식을 이용하여 암호화 했는데 길이가 맞지 않아 복호화하는데 에러가 나더라구여..이방법은 아닌듯합니다.ㅠ

방향만 제시해 주셔도 정말 감사하고 저부분의 해결책까지 주신다면 정말 너무너무 감사하겠습니다.

그럼 좋은 하루 되시기 바랍니다.





[연관 글]






[최초 등록일: ]
[최종 수정일: 11/22/2012]


비밀번호

댓글 작성자
 



2012-11-23 05시10분
개인키를 공개하기엔 껄끄러운 것은 사실이니 이해해 주세요. ^^

저도 그런 식의 암호화 파일을 로드해 본적은 없지만 검색해 보니 다음의 글이 나옵니다.

How to use key files in RSA Encryption using C#?
; http://stackoverflow.com/questions/6868867/how-to-use-key-files-in-rsa-encryption-using-c

위의 글에 따라 BouncyCastle.Crypto.dll 을 참조해서 Org.BouncyCastle.Security.PublicKeyFactory.CreateKey를 이용하여 로드해 보세요.
정성태
2012-11-23 05시14분
[우라미윰] 정말 많은 도움이 되었습니다. 감사합니다.ㅎㅎ
[guest]
2013-01-15 08시56분
"우라미윰"님... 아래의 글에 윤용한 님이 더 확실한 답변을 달아 주셨습니다.

http://www.sysnet.pe.kr/2/0/1401
정성태

... 16  17  18  [19]  20  21  22  23  24  25  26  27  28  29  30  ...
NoWriterDateCnt.TitleFile(s)
5455한예지 donator1/16/20216466교재 194페이지 콜백메서드 질문 있습니다! [5]
5454한예지 donator1/15/20216105교재 208쪽 질문....있습니다... [3]
5453안녕하세요1/15/20217542C# dll 파일을 C++에서 사용 시 memory leak 문제 [2]파일 다운로드1
5452예지1/15/20216663var를 사용할 수 없는 이유가 궁금합니다! [3]
5451예지1/14/20215525for문의 초기식에 대해 질문드립니다. [3]
5450예지1/13/20215524Action 델리게이트 사용법 질문있습니다! [2]
5449김성민1/13/20216228Winform UserControl 상속 vs 감싸기? [2]
5448서형주1/13/20215960안녕하세요~~ DataGridView에 데이터를 표시하는 동작방법이 궁금합니다. [2]
5447종범1/11/20217602[WPF/OpenCV] 이미지->영상 저장에 대해서 질문 드립니다!! [5]파일 다운로드1
5446민우1/11/20215627닷넷 런타임을 dll 파일로 포함시킬수 있나요? [2]
5445정도현1/8/20215400directShow RenderFile 관련 재질문드립니다 [5]파일 다운로드1
5444정도현1/8/20215368directShow RenderFile 관련 질문드립니다 [3]
5443윤영호1/7/20215750xml 파일에서 데이터를 가지고 와서 list에 넣는 것을 질문드리고 싶습니다. [1]파일 다운로드1
5442진우1/4/20215535DB연결 객체나 파일 등은 GC 에서 관리해주지 않는 이유가 궁금합니다. [2]
5441한예지 donator1/4/20215963DB 연결 방법 질문 있습니다. [1]
5440한예지 donator1/1/20216560추상클래스로와 new [4]
5439이상호12/31/20208150VC 프로젝트 에서 _main 함수에서 참조되는 확인할 수 없는 외부 기호 [4]파일 다운로드1
5438김윤12/29/202010264C# winform using으로인한 메모리 해제 타이밍과 변수 복사 타이밍 [2]
5437한예지 donator12/25/20207317for문 안에 있는 지역변수의 생성 및 유지 기간에 대해 질문드립니다! [6]
5436영귤12/24/20206023fixed는 자동으로 stackalloc이 되는 건가요? [1]
5435한예지 donator12/24/20205845ArraySegment, Span, ReadOnlySpan 질문있습니다! [1]
5434한예지 donator12/23/20206414ToString 재정의 질문있습니다! [8]
5433한예지 donator12/23/20206392List<ArrarySegment<int>> 사용법 질문드립니다! [2]
5431한예지 donator12/17/20208228비동기 소켓 서버 질문 드립니다! [1]
5430종범12/16/20207364[WPF] Task 관련 재질문 드립니다. [2]파일 다운로드1
5429종범12/16/20207296[WPF] Task 관련 질문 드립니다. [1]파일 다운로드1
... 16  17  18  [19]  20  21  22  23  24  25  26  27  28  29  30  ...