2011-09-14 3 views
0

안녕 얘들 아, 나는 더 오래된 전화기에서 메시지를 암호화 할 때 새로운 것보다 큰 문제가있다.J2ME TEA 구형 전화기에서의 암호화 문제

이전 하드웨어 (CLDC1.0, MIDP2.0)에서 실행되도록 코드를 컴파일했는데 어떤 이유로 인해 TEA을 암호화했을 때 Nokia N70에서 암호화가 끝나면 문자 하나가 망가집니다. 일반 텍스트에서 차까지. (예, 많은 chars 중에서 오직 하나의 작은 char가 망가졌습니다.)

정확하게 N8과 다른 최신 전화기에서 똑같은 응용 프로그램을 실행할 때 올바르게 암호화됩니다.

기본적으로 그것은 문자열과 부울 입력을받습니다. 부울 상태는 암호화 또는 암호 해독을위한 목적이라면 문자열은 인코딩하려고합니다. 또는 디코딩.

거기에서 나는 기본적으로 문자열을 바이트 배열로 스트립하고 그에 따라 (암호화 또는 복호화의 경우) 처리 한 다음 나중에 문자열로 변환 한 다음 반환 (해독)하거나 Base64 (암호화)로 인코딩합니다. .

Base64로 캡슐화하는 이유는 sms에서 보낼 수 있기 때문입니다.이 인코딩은 특수 문자가 아닌 특수 문자를 사용하기 때문에 최대 160 자로 제한되어 앱에 바람직합니다.

private String HandleTEA(String input, boolean aIsEncryption) throws UnsupportedEncodingException 
{ 
    System.out.println(input); 
    String returnable = ""; 
    try 
    { 
     TEAEngine e = new TEAEngine(); 
     if (aIsEncryption) 
     { 
      e.init(true, TEAkey); 
     } 
     else 
     { 
      if(getDebug()) 
      { 
       input = input.substring(1); 

      } 
      input = base64.decodeString(input); 
      e.init(false, TEAkey); 

     } 
     byte[] aData = input.getBytes("ISO-8859-1"); 

     byte[] textToUse = aData; 

     int len = ((textToUse.length + 16 - 1)/16) * 16; 

     byte[] secondUse = new byte[len]; 


     for(int i = 0; i < textToUse.length; i++) 
     { 
      secondUse[i] = textToUse[i]; 
     } 

     for(int i = textToUse.length; i < secondUse.length; i++) 
     { 
      secondUse[i] = 0; 
     } 

     int blockSize = e.getBlockSize(); 

     byte[] outBytes = new byte[secondUse.length]; 

     for (int chunkPosition = 0; chunkPosition < secondUse.length; chunkPosition += blockSize) 
     { 
      int chunkSize = Math.min(blockSize, (textToUse.length - (chunkPosition * blockSize))); 
      e.processBlock(secondUse, chunkPosition, outBytes, chunkPosition); 
     } 

     if(aIsEncryption) 
     { 
      Baseless = new String(outBytes, "ISO-8859-1"); 
      String encodedString = base64.encodeString(Baseless); 
      char[] theChars = new char[encodedString.length()+1]; 

      for(int i = 0; i < theChars.length; i++) 
      { 
       if(i == 0) 
       { 
        theChars[i] = '1'; 
       } 
       else 
       { 
        theChars[i] = encodedString.charAt(i-1); 
       } 
      } 

      byte[] treating = new byte[theChars.length]; 

       for(int i = 0; i < theChars.length; i++) 
       { 
        treating[i] = (byte)theChars[i]; 
       } 
      returnable = new String(treating, "ISO-8859-1"); 
     } 
     else 
     { 
      char[] theChars = new String(outBytes, "ISO-8859-1").toCharArray(); 
      String fixed =""; 
      for(int i = 0; i < theChars.length; i++) 
      { 
       char c = theChars[i]; 
       if (c > 0) fixed = fixed + c; 
      } 
      returnable = fixed; 
     } 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
    return returnable; 
} 

누구나 일이 될 수 있습니다 무엇에 어떤 생각을 가지고 : 코드 이제

? 비교 이것에 대한

내가 N70에서지고있어 무엇 : e+TgV/fU5RUOYocMRfG7vqpQT+jKlujU6eIzZfEjGhXdFwNB46wYNSiUj5H/tWbta26No6wjQylgTexhS6uqyw==

과 N8에서 : e+TgV/fU5RUOYocMRfG7vqpQT+jKlujU6eIzZfEjgBXdFwNB46wYNSiUj5H/tWbta26No6wjQylgTexhS6uqyw==

당신이 모든 것이 비슷하지만 코드의 중간에 볼 수있는 것 N70에 Gh를로 인코딩 도착합니다 ... N8 GB의로 나타

우리가 정말 이상한 문자 얻을 N70에 의해 암호화 된 데이터를 해독 할 때 :

0b1b5e0167aaee06

당신이 도움이 될 수 있습니다 희망 :will add this here tomorrow since I don't have the saved output with me

여기

(그들은 무작위로 시작시 생성 된 것 키를 사용할 것입니다 그래도 실제 생활에서) 모두 동일한 키를 사용하는 사용되는 열쇠 이걸 가지고 나와 함께 너의 관심과 도움을 주셔서 감사합니다!

답변

1

코드가 이해하기 어렵지만 Baseless = new String(outBytes, "ISO-8859-1"); 및 이와 유사한 구조가 거의 틀립니다. 왜 암호로 암호를 풀고 싶니? 그냥 base64 인코딩 outBytes 직접.

+0

예, ISO-8859-1은 모든 바이트의 문자를 디코딩 할 수 없습니다. 따라서 임의의 바이트 (암호문)를 사용하여'String '을 생성 할 때, 문자 중 일부는 실수로 또는?로 바뀌므로 데이터가 손실됩니다. – erickson

+0

Baseless의 사용은 기본적으로 콘솔 디버깅 용이었습니다 ... (J2ME IDE를 사용하고 있습니다. 디버그 기능이 전혀없는 것 같습니다) ISO-8859-1의 사용은 핸드폰과 게이트웨이 ... 이 특정 인코딩에 대한 이전 문제가 없었지만 일부 경우에 최종 결과에 문제가 발생했습니다 ... PS : 인코딩을 UTF-8/UTF-16 btw로 전환하면 동일한 문제가 발생합니다. –

+0

사실, UTF-8과 16을 사용할 때 절대 횡설수설이 나에게 돌아왔다. –