Java解码盐渍Base64

时间:2015-01-20 09:49:40

标签: java passwords base64 decode

我是Java编程的新手,并尝试制作一个基于Base64和UTF-8的解码器。

我目前正在尝试让解码器从控制台获取输入,然后执行解码并在控制台中显示结果。 我有点迷失在如何通过解码输入我的输入 “public static byte [] decode(String src)”然后在控制台中将其打印出来。

到目前为止我得到的是下面的代码:

import java.io.*;
import java.io.ByteArrayOutputStream;

public class Decode {
  //String to decode ="AHzRlmUMPa7PhTZdmoCU7Swy/YWcaMF20/TQJP8PJAOXqY12sf90XzxQ+jq/4ktnpYaSsrAc2KBA/ZpycGueks9khoJvRPPeZft7SR8WTrvbTtvHXvpm5Yjo3KD02MBjp6dfGsWAXtitqHuJDhK1O36E3CV0vn5iVjlpDIZrYQJramXoK2gVttFlDkaN86deWmoutSKDkn4o/ppPD2dK6Oo48ydJA6QsgEDdkR9nsmZ7rYZigjdb0y+o4ByjD1oFBG/5odZGpYPbvclA5tWcZBcmzxuumcKu5+Adu9L6paWltXgYUV1Kxkt7mGZWGiXljkedfFd2F49AaRE2wv+1tdeCvOuuDGuuxYVkXc2AxO0bESXdjoTOiSM=";
private static final char[] encodeTable = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' };
private static final char PAD = '=';
public static final int HASHLEN = 16;
public static final int HASHHEXLEN = 32;

public static void main (String[] args) {
  System.out.print("Enter text to decode: ");
   //  open up standard input
  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
   String passwd = null;
  try {
     passwd = br.readLine();
  } catch (IOException ioe) {
     System.out.println("IO error trying to read your name!");
     System.exit(1);
  }
   System.out.println("The Password is: " + passwd);

 }
 public static byte[] decode(String src)  {

int bits = src.length() * 6;
ByteArrayOutputStream res = new ByteArrayOutputStream(bits / 8);

int index = 0;
int bytesRemaining = src.length();
while (bytesRemaining >= 4)
{
  int val0 = getVal(src.charAt(index));
  while ((val0 == -2) && (bytesRemaining > 0))
  {
    index++;
    bytesRemaining--;
    if (bytesRemaining > 0) {
      val0 = getVal(src.charAt(index));
    }
  }
  if (bytesRemaining == 0) {
    throw new IllegalStateException("Unexpected end of input.");
  }
  int val1 = getVal(src.charAt(index + 1));
  while ((val1 == -2) && (bytesRemaining > 0))
  {
    index++;
    bytesRemaining--;
    if (bytesRemaining > 0) {
      val1 = getVal(src.charAt(index + 1));
    }
  }
  if (bytesRemaining == 0) {
    throw new IllegalStateException("Unexpected end of input.");
  }
  int val2 = getVal(src.charAt(index + 2));
  while ((val2 == -2) && (bytesRemaining > 0))
  {
    index++;
    bytesRemaining--;
    if (bytesRemaining > 0) {
      val2 = getVal(src.charAt(index + 2));
    }
  }
  if (bytesRemaining == 0) {
    throw new IllegalStateException("Unexpected end of input.");
  }
  int val3 = getVal(src.charAt(index + 3));
  while ((val3 == -2) && (bytesRemaining > 0))
  {
    index++;
    bytesRemaining--;
    if (bytesRemaining > 0) {
      val3 = getVal(src.charAt(index + 3));
    }
  }
  if (bytesRemaining == 0) {
    throw new IllegalStateException("Unexpected end of input.");
  }
  int group = 0;
  int padCount = 0;
  if (val0 != -1) {
    group |= val0 << 18;
  } else {
    padCount++;
  }
  if (val1 != -1) {
    group |= val1 << 12;
  } else {
    padCount++;
  }
  if (val2 != -1) {
    group |= val2 << 6;
  } else {
    padCount++;
  }
  if (val3 != -1) {
    group |= val3;
  } else {
    padCount++;
  }
  res.write((group & 0xFF0000) >> 16);
  if (val2 != -1)
  {
    res.write((group & 0xFF00) >> 8);
    if (val3 != -1) {
      res.write(group & 0xFF);
    }
  }
  if (padCount > 0) {
    bytesRemaining = 0;
  } else {
    bytesRemaining -= 4;
  }
  index += 4;
}
  return res.toByteArray();
}
  public static String decodeToString(String s)
  {
  return new String(decode(s));
  } 
   private static final int getVal(char ch)
{
if (ch == '=') {
  return -1;
}
int val = ch;
if ((val >= 65) && (val <= 90)) {
  return val - 65;
}
if ((val >= 97) && (val <= 122)) {
  return val - 71;
}
if ((val >= 48) && (val <= 57)) {
  return val + 4;
}
if (val == 43) {
  return 62;
}
if (val == 47) {
  return 63;
}
return -2;
}
}

1 个答案:

答案 0 :(得分:0)

    byte[] data = decode(passwd);
    System.out.print("Hex: ");
    for (byte element : data) {
        System.out.printf("%02X", element);
    }