2013-11-21 4 views
-1

안녕하세요, 일부 코드를 찾은 후 일부 코드를 찾은 Encrypt 문자열 (마녀 난 web-service에 매개 변수로 설정) 그리고 잘 작동하고있어, 이걸 이해하기가 어렵습니다. 구멍 클래스를 둬라.암호화/암호 해독

public class RSA { 
    Vector<Object> vectEnc; 
    Object enc[]; 
    private long P, Q; 
    private long N, M, E = 11; 
    private long D; 
    public RSA() { 
     P = 6151; 
     Q = 8807; 
     N = P * Q; 
     M = (P - 1) * (Q - 1); 
     E = 11; 
     D = 44310191; 
     vectEnc = new Vector<Object>(); 
    } 
    public String doEncryption(String message) { 
     try { 
      String str = new BASE64Encoder().encode(message.getBytes("UTF-8")); 
      String encString = ""; 
      for (int i = 0; i < str.length(); i += 3) { 
       String tempAsci = "1"; 
       String tempStr; 
       for (int h = 0; h < 3; h++) { 
        int total = i + h; 
        if (total < str.length()) { 
         tempStr = String.valueOf((int) (str.subSequence(total, 
           total + 1).charAt(0)) - 30); 
         if (tempStr.length() < 2) { 
          tempStr = "0" + tempStr; 
         } 
        } else { 
         break; 
        } 
        tempAsci = tempAsci + tempStr; 
       } 
       vectEnc.add(tempAsci + "1"); 
      } 
      enc = vectEnc.toArray(); 
      vectEnc.removeAllElements(); 
      for (int i = 0; i < enc.length; i++) { 
       long base = Long.parseLong(enc[i].toString()); 
       long powMod = powMod(base, E, N); 
       encString = encString + String.valueOf(powMod) + " "; 
      } 
      return encString; 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 
    public String doDecryption(String codeMsg) { 
     String[] decryptArray = codeMsg.split(" "); 
     String decryptStr = ""; 
     String originalStr = ""; 
     for (int i = 0; i < decryptArray.length; i++) { 
      long base = Long.parseLong(decryptArray[i]); 
      long powMod = powMod(base, D, N); 
      String powModString = String.valueOf(powMod); 
      decryptStr = decryptStr 
        + powModString.subSequence(1, powModString.length() - 1); 
     } 
     for (int i = 0; i < decryptStr.length(); i += 2) { 
      char ch = (char) (Integer.parseInt(decryptStr.subSequence(i, i + 2) 
        .toString()) + 30); 
      originalStr = originalStr + ch; 
     } 
     BASE64Decoder decoder = new BASE64Decoder(); 
     byte[] decBytes = null; 
     try { 
      decBytes = decoder.decodeBuffer(originalStr); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     String decodeStr = new String(decBytes); 
     return decodeStr; 
    } 
    public long powMod(long base, long exp, long modula) { 
     long accum = 1; 
     int i = 0; 
     long base2 = base; 
     while ((exp >> i) > 0) { 
      if (((exp >> i) & 1) == 1) { 
       accum = mo((accum * base2), modula); 
      } 
      base2 = mo((base2 * base2), modula); 
      i++; 
     } 
     return accum; 
    } 
    public long mo(long g, long l) { 
     return (long) (g - (l * Math.floor(g/l))); 
    } 
} 

하지만 문자열의 길이가 더 (56)가 일부 Google 심지어 더이 코드에 의해 사용이 무엇 알고리즘이다, 내가하지 않는다

java.lang.NumberFormatException: For input string: "174-17-201" 
    at java.lang.NumberFormatException.forInputString(Unknown Source) 
    at java.lang.Long.parseLong(Unknown Source) 
    at java.lang.Long.parseLong(Unknown Source) 
    at com.info.test.RSA.doEncryption(RSA.java:49) 
    at com.info.test.Test.main(Test.java:56) 

처럼 예외를 던져 그리고 난 때 문제가 간단한 해결책은 문자열의 일부분을 만들어서 찾았습니다. Encryption 그것 같이.

int MAX_LAN = 55; 
List<String> splitEqually = splitEqually(string,MAX_LAN); 
String encodeString = ""; 
for (int i = 0; i < splitEqually.size(); i++) { 
    encodeString +=rsa.doEncryption(splitEqually.get(i)); 
} 
System.out.println(encodeString); 
public static List<String> splitEqually(String text, int size) { 
    List<String> ret = new ArrayList<String>((text.length() + size - 1)/size); 
    for (int start = 0; start < text.length(); start += size) { 
     ret.add(text.substring(start, Math.min(text.length(), start + size))); 
    } 
    return ret; 
} 

제대로 작동하므로 올바른 방법입니까? 아니요?

+0

당신이 [Keyczar] 사용하지 않는 이유를 알고 (https://code.google.com/ : 자바에서 RSA 암호화/복호화를 수행하는 방법에 대한 기사의이 시리즈를 따라 p/keyczar /). –

+0

이 암호화/암호 해독에 대해 알지 못합니다. – Youddh

+0

나도 그렇다. 그래서 Keyczar를 사용하고, 걱정하지 마라. –

답변