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)
5376영귤9/1/20207055nullable 타입간의 비교연산은 그냥 가능한 건가요? [1]
5375영귤8/30/20208542이벤트와 델리게이트의 차이가 궁금합니다. [2]
5374guest8/27/20209629시작하세요! C# 8.0 프로그래밍 책에 오타가 있습니다. [1]
5373agj8/26/20207831System.Single::ToString()함수의 IL코드를 보았는데 ldnull, throw가 전부입니다. 왜 이렇게 짧죠? [2]
5372민성8/24/20207831안녕하세요 WPF 웹브라우저 컨트롤에서 웹브라우저 자체를 엣지로 할 수가 있나요? [2]
5371서현준8/11/20206911Hyper-V 내부 네트워크 환경 중, VM 에서 인터넷 접속 [1]
5370독자8/11/20205936.net createobject 관련 질문입니다.. [4]
5369독자8/10/20206263c# 8.0 프로그래밍 책에 대한 질문 드립니다 [1]
5368guest8/10/20207544시작하세요! C# 8.0 프로그래밍 책에 오타가 있습니다. [1]
5367박순기8/8/20206459디버깅 시 반전되는 부분 글 색상이나 배경색을 변경하는 방법 [3]파일 다운로드1
5366간절함8/7/20207148하나의 솔루션에서, 32비트 프로젝트에서 다른 64비트 프로젝트 참조하는 방법 궁금합니다. [4]
5365영귤8/6/20206394TimeSpan 구할 때 시간대를 바꿔도 같은 값이 나오는 것 같습니다. [1]
5364박순기8/5/20206444visual studio의 menu bar font size 변경방법 문의 [2]파일 다운로드1
5363클락8/1/20207046c# 9.0 출간 준비 중이신가요? [2]
5361하태7/29/20206680안녕하세요! 바이너리데이터 파싱 질문 드리겠습니다!. [2]
5360진우7/28/20207597엑셀에서 발생하는 모든 이벤트를 감지 할수 있는지 궁금합니다. [6]파일 다운로드1
5358홍길동7/22/20206339개체에서 open 속성이나 매서드가 지원 되지 않읍니다.라고 오류창이 뜨는데. [1]
5357손동섭7/22/20206381책 예제코드... [3]
5355neska7/21/20206782안녕하세요 문의 드립니다 [1]
5354민성7/15/20208248안녕하세요 db연결 문자 보안 [2]
5353형성재7/14/20207317Visual Studio Setup Project에서 VC++2010재배포패키지설치 [4]
5352윤식7/10/20207273닷넷코어 빌드 시 runtimeconfig 파일을 없앨 수 있는지.. [4]
5351runr...7/2/20207164C# 에서 C++ dll 병렬 사용 [1]
5350홍성호6/29/20208756C++에서 정의된 구조체(공유메모리)를 C#으로 공유메모리에서 구조체 변환시 에러가 발생 합니다. [1]파일 다운로드1
5349jero...6/24/20206287logon credential provider 관련 문의드립니다. [1]
5348776/19/20206050시작하세요 C# 8.0프로그래밍 책에 대한 질문입니다. [8]
... 16  17  18  19  20  21  [22]  23  24  25  26  27  28  29  30  ...