当前位置: 首页 > 知识库问答 >
问题:

Java解码salted Base64

丌官浩旷
2023-03-14

我对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个答案

濮阳振海
2023-03-14
    byte[] data = decode(passwd);
    System.out.print("Hex: ");
    for (byte element : data) {
        System.out.printf("%02X", element);
    }
 类似资料:
  • 我有一个用mvn Exec:java运行的程序(我的主文件是用utf-8编码的,系统的默认字符集是windows-1252) 我不明白为什么第一次打印工作,根据文档getBytes使用给定的字符集将字符串编码成字节序列,字符串构造函数通过使用平台的默认字符集解码指定的字节数组来构造新的字符串

  • 本文向大家介绍java TreeMap源码解析详解,包括了java TreeMap源码解析详解的使用技巧和注意事项,需要的朋友参考一下 java TreeMap源码解析详解  在介绍TreeMap之前,我们来了解一种数据结构:排序二叉树。相信学过数据结构的同学知道,这种结构的数据存储形式在查找的时候效率非常高。 如图所示,这种数据结构是以二叉树为基础的,所有的左孩子的value值都是小于根结点的v

  • 问题内容: 我经常卡在没有源的Java类文件中,并且试图理解我手头的问题。 请注意,反编译器是有用的,但在所有情况下都不足够… 我有两个问题 有哪些工具可用来查看Java字节码(最好从linux命令行中获得) 什么是熟悉Java字节码语法的良好参考 问题答案: 与其直接查看Java字节码(需要熟悉Java虚拟机及其操作),不如尝试使用Java反编译实用程序。反编译器将尝试从指定文件创建源文件。 该

  • 本文向大家介绍Java Reference源码解析,包括了Java Reference源码解析的使用技巧和注意事项,需要的朋友参考一下 Reference对象封装了其它对象的引用,可以和普通的对象一样操作,在一定的限制条件下,支持和垃圾收集器的交互。即可以使用Reference对象来引用其它对象,但是最后还是会被垃圾收集器回收。程序有时候也需要在对象回收后被通知,以告知对象的可达性发生变更。  J

  • 问题内容: 我正在尝试对java中的AES数据进行编码,通过网络发送数据并以ruby对其进行解码。 基本字符串可以正常工作,但是一旦字符串的长度为16个字节或更多,我在解码后的红宝石字符串的编码中就会产生垃圾。我猜想它与填充有关(虽然不确定,因为它甚至影响精确大小为16的字符串) 我尝试使用PKCS或只是在字符串的末尾添加空格以匹配确切的长度而没有运气 还可以有人解释为什么我必须在红宝石中执行“

  • 这是我的java程序: