2013-11-21 50 views
-1

嗨,我发现了一些代码后做了一些谷歌,我用这个代码Encrypt字符串(女巫我设置为参数在web-service) 它的工作正常,这很难让我理解这一点所以把代码放在空洞类。在java中的加密/解密

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扔异常像

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) 

我甚至没有什么是算法是通过这个代码用的,我做了一些Google和我发现简单的解决方法是使字符串的一部分,并做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/ p/keyczar /)。 –

+0

我对这个加密/解密没有任何想法。 – Youddh

+0

我也没有。这就是为什么我使用Keyczar,只是不担心它。 –

回答