AES,MD5,BASE64,Paillier加密算法

1.AES:

import java.security.SecureRandom;   
  
import javax.crypto.Cipher;   
import javax.crypto.KeyGenerator;   
import javax.crypto.SecretKey;   
import javax.crypto.spec.SecretKeySpec;   
  
  
public class AES2Cryption {   
  
    public static String encrypt(String seed, String cleartext) throws Exception {   
        byte[] rawKey = getRawKey(seed.getBytes());   
        byte[] result = encrypt(rawKey, cleartext.getBytes());   
        return toHex(result);   
    }   
       
    public static String decrypt(String seed, String encrypted) throws Exception {   
        byte[] rawKey = getRawKey(seed.getBytes());   
        byte[] enc = toByte(encrypted);   
        byte[] result = decrypt(rawKey, enc);   
        return new String(result);   
    }   
  
    private static byte[] getRawKey(byte[] seed) throws Exception {   
        KeyGenerator kgen = KeyGenerator.getInstance("AES");   
        SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");   
        sr.setSeed(seed);   
        kgen.init(128, sr); // 192 and 256 bits may not be available   
        SecretKey skey = kgen.generateKey();   
        byte[] raw = skey.getEncoded();   
        return raw;   
    }   
  
       
    private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {   
        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");   
        Cipher cipher = Cipher.getInstance("AES");   
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec);   
        byte[] encrypted = cipher.doFinal(clear);   
        return encrypted;   
    }   
  
    private static byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception {   
        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");   
        Cipher cipher = Cipher.getInstance("AES");   
        cipher.init(Cipher.DECRYPT_MODE, skeySpec);   
        byte[] decrypted = cipher.doFinal(encrypted);   
        return decrypted;   
    }   
  
    public static String toHex(String txt) {   
        return toHex(txt.getBytes());   
    }   
    public static String fromHex(String hex) {   
        return new String(toByte(hex));   
    }   
       
    public static byte[] toByte(String hexString) {   
        int len = hexString.length()/2;   
        byte[] result = new byte[len];   
        for (int i = 0; i < len; i++)   
            result[i] = Integer.valueOf(hexString.substring(2*i, 2*i+2), 16).byteValue();   
        return result;   
    }   
  
    public static String toHex(byte[] buf) {   
        if (buf == null)   
            return "";   
        StringBuffer result = new StringBuffer(2*buf.length);   
        for (int i = 0; i < buf.length; i++) {   
            appendHex(result, buf[i]);   
        }   
        return result.toString();   
    }   
    private final static String HEX = "0123456789ABCDEF";   
    private static void appendHex(StringBuffer sb, byte b) {   
        sb.append(HEX.charAt((b>>4)&0x0f)).append(HEX.charAt(b&0x0f));   
    }   
       
} 

2.Paillier:

package edu.kxw.encryptionAlgorithm;
/**
 * This program is free software: you can redistribute it and/or modify it 
 * under the terms of the GNU General Public License as published by the Free 
 * Software Foundation, either version 3 of the License, or (at your option) 
 * any later version. 
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT 
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for 
 * more details. 
 * 
 * You should have received a copy of the GNU General Public License along with 
 * this program.  If not, see .
 */

import java.math.*;
import java.util.*;

/**
 * Paillier Cryptosystem 

* References:
* [1] Pascal Paillier, "Public-Key Cryptosystems Based on Composite Degree Residuosity Classes," EUROCRYPT'99. * URL: http://www.gemplus.com/smart/rd/publications/pdf/Pai99pai.pdf
* * [2] Paillier cryptosystem from Wikipedia. * URL: http://en.wikipedia.org/wiki/Paillier_cryptosystem * @author Kun Liu ([email protected]) * @version 1.0 */ public class Paillier { /** * p and q are two large primes. * lambda = lcm(p-1, q-1) = (p-1)*(q-1)/gcd(p-1, q-1). */ private BigInteger p, q, lambda; /** * n = p*q, where p and q are two large primes. */ public BigInteger n; /** * nsquare = n*n */ public BigInteger nsquare; /** * a random integer in Z*_{n^2} where gcd (L(g^lambda mod n^2), n) = 1. */ private BigInteger g; /** * number of bits of modulus */ private int bitLength; /** * Constructs an instance of the Paillier cryptosystem. * @param bitLengthVal number of bits of modulus * @param certainty The probability that the new BigInteger represents a prime number will exceed (1 - 2^(-certainty)). The execution time of this constructor is proportional to the value of this parameter. */ public Paillier(int bitLengthVal, int certainty) { KeyGeneration(bitLengthVal, certainty); } /** * Constructs an instance of the Paillier cryptosystem with 512 bits of modulus and at least 1-2^(-64) certainty of primes generation. */ public Paillier() { KeyGeneration(512, 64); } /** * Sets up the public key and private key. * @param bitLengthVal number of bits of modulus. * @param certainty The probability that the new BigInteger represents a prime number will exceed (1 - 2^(-certainty)). The execution time of this constructor is proportional to the value of this parameter. */ public void KeyGeneration(int bitLengthVal, int certainty) { bitLength = bitLengthVal; /*Constructs two randomly generated positive BigIntegers that are probably prime, with the specified bitLength and certainty.*/ p = new BigInteger(bitLength / 2, certainty, new Random()); q = new BigInteger(bitLength / 2, certainty, new Random()); n = p.multiply(q); nsquare = n.multiply(n); g = new BigInteger("2"); lambda = p.subtract(BigInteger.ONE).multiply(q.subtract(BigInteger.ONE)).divide( p.subtract(BigInteger.ONE).gcd(q.subtract(BigInteger.ONE))); /* check whether g is good.*/ if (g.modPow(lambda, nsquare).subtract(BigInteger.ONE).divide(n).gcd(n).intValue() != 1) { System.out.println("g is not good. Choose g again."); System.exit(1); } } /** * Encrypts plaintext m. ciphertext c = g^m * r^n mod n^2. This function explicitly requires random input r to help with encryption. * @param m plaintext as a BigInteger * @param r random plaintext to help with encryption * @return ciphertext as a BigInteger */ public BigInteger Encryption(BigInteger m, BigInteger r) { return g.modPow(m, nsquare).multiply(r.modPow(n, nsquare)).mod(nsquare); } /** * Encrypts plaintext m. ciphertext c = g^m * r^n mod n^2. This function automatically generates random input r (to help with encryption). * @param m plaintext as a BigInteger * @return ciphertext as a BigInteger */ public BigInteger Encryption(BigInteger m) { BigInteger r = new BigInteger(bitLength, new Random()); return g.modPow(m, nsquare).multiply(r.modPow(n, nsquare)).mod(nsquare); } /** * Decrypts ciphertext c. plaintext m = L(c^lambda mod n^2) * u mod n, where u = (L(g^lambda mod n^2))^(-1) mod n. * @param c ciphertext as a BigInteger * @return plaintext as a BigInteger */ public BigInteger Decryption(BigInteger c) { BigInteger u = g.modPow(lambda, nsquare).subtract(BigInteger.ONE).divide(n).modInverse(n); return c.modPow(lambda, nsquare).subtract(BigInteger.ONE).divide(n).multiply(u).mod(n); } /** * main function * @param str intput string */ public static void main(String[] str) { /* instantiating an object of Paillier cryptosystem*/ Paillier paillier = new Paillier(); /* instantiating two plaintext msgs*/ BigInteger m1 = new BigInteger("20"); BigInteger m2 = new BigInteger("60"); /* encryption*/ BigInteger em1 = paillier.Encryption(m1); BigInteger em2 = paillier.Encryption(m2); /* printout encrypted text*/ System.out.println(em1); System.out.println(em2); /* printout decrypted text */ System.out.println(paillier.Decryption(em1).toString()); System.out.println(paillier.Decryption(em2).toString()); /* test homomorphic properties -> D(E(m1)*E(m2) mod n^2) = (m1 + m2) mod n */ BigInteger product_em1em2 = em1.multiply(em2).mod(paillier.nsquare); BigInteger sum_m1m2 = m1.add(m2).mod(paillier.n); System.out.println("original sum: " + sum_m1m2.toString()); System.out.println("decrypted sum: " + paillier.Decryption(product_em1em2).toString()); /* test homomorphic properties -> D(E(m1)^m2 mod n^2) = (m1*m2) mod n */ BigInteger expo_em1m2 = em1.modPow(m2, paillier.nsquare); BigInteger prod_m1m2 = m1.multiply(m2).mod(paillier.n); System.out.println("original product: " + prod_m1m2.toString()); System.out.println("decrypted product: " + paillier.Decryption(expo_em1m2).toString()); } }

3.Base64:

/**
 * 
 */
package com.gootrip.util;

/*
 * Base64 encoding and decoding.
 * Copyright (C) 2001-2004 Stephen Ostermiller
 * http://ostermiller.org/contact.pl?regarding=Java+Utilities
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * See COPYING.TXT for details.
 * http://www.jq-school.com
 */

import java.io.*;
import gnu.getopt.*;
import java.text.MessageFormat;
import java.util.ResourceBundle;
import java.util.Locale;

/**
 * Implements Base64 encoding and decoding as defined by RFC 2045: "Multipurpose Internet
 * Mail Extensions (MIME) Part One: Format of Internet Message Bodies" page 23.
 * More information about this class is available from ostermiller.org.
 *
 * 
*

The Base64 Content-Transfer-Encoding is designed to represent * arbitrary sequences of octets in a form that need not be humanly * readable. The encoding and decoding algorithms are simple, but the * encoded data are consistently only about 33 percent larger than the * unencoded data. This encoding is virtually identical to the one used * in Privacy Enhanced Mail (PEM) applications, as defined in RFC 1421.

* *

A 65-character subset of US-ASCII is used, enabling 6 bits to be * represented per printable character. (The extra 65th character, "=", * is used to signify a special processing function.)

* *

NOTE: This subset has the important property that it is represented * identically in all versions of ISO 646, including US-ASCII, and all * characters in the subset are also represented identically in all * versions of EBCDIC. Other popular encodings, such as the encoding * used by the uuencode utility, Macintosh binhex 4.0 [RFC-1741], and * the base85 encoding specified as part of Level 2 PostScript, do no * share these properties, and thus do not fulfill the portability * requirements a binary transport encoding for mail must meet.

* *

The encoding process represents 24-bit groups of input bits as output * strings of 4 encoded characters. Proceeding from left to right, a * 24-bit input group is formed by concatenating 3 8bit input groups. * These 24 bits are then treated as 4 concatenated 6-bit groups, each * of which is translated into a single digit in the base64 alphabet. * When encoding a bit stream via the base64 encoding, the bit stream * must be presumed to be ordered with the most-significant-bit first. * That is, the first bit in the stream will be the high-order bit in * the first 8bit byte, and the eighth bit will be the low-order bit in * the first 8bit byte, and so on.

* *

Each 6-bit group is used as an index into an array of 64 printable * characters. The character referenced by the index is placed in the * output string. These characters, identified in Table 1, below, are * selected so as to be universally representable, and the set excludes * characters with particular significance to SMTP (e.g., ".", CR, LF) * and to the multipart boundary delimiters defined in RFC 2046 (e.g., * "-").

*
 *                  Table 1: The Base64 Alphabet
 *
 *   Value Encoding  Value Encoding  Value Encoding  Value Encoding
 *       0 A            17 R            34 i            51 z
 *       1 B            18 S            35 j            52 0
 *       2 C            19 T            36 k            53 1
 *       3 D            20 U            37 l            54 2
 *       4 E            21 V            38 m            55 3
 *       5 F            22 W            39 n            56 4
 *       6 G            23 X            40 o            57 5
 *       7 H            24 Y            41 p            58 6
 *       8 I            25 Z            42 q            59 7
 *       9 J            26 a            43 r            60 8
 *      10 K            27 b            44 s            61 9
 *      11 L            28 c            45 t            62 +
 *      12 M            29 d            46 u            63 /
 *      13 N            30 e            47 v
 *      14 O            31 f            48 w         (pad) =
 *      15 P            32 g            49 x
 *      16 Q            33 h            50 y
 * 
*

The encoded output stream must be represented in lines of no more * than 76 characters each. All line breaks or other characters no * found in Table 1 must be ignored by decoding software. In base64 * data, characters other than those in Table 1, line breaks, and other * white space probably indicate a transmission error, about which a * warning message or even a message rejection might be appropriate * under some circumstances.

* *

Special processing is performed if fewer than 24 bits are available * at the end of the data being encoded. A full encoding quantum is * always completed at the end of a body. When fewer than 24 input bits * are available in an input group, zero bits are added (on the right) * to form an integral number of 6-bit groups. Padding at the end of * the data is performed using the "=" character. Since all base64 * input is an integral number of octets, only the following cases can * arise: (1) the final quantum of encoding input is an integral * multiple of 24 bits; here, the final unit of encoded output will be * an integral multiple of 4 characters with no "=" padding, (2) the * final quantum of encoding input is exactly 8 bits; here, the final * unit of encoded output will be two characters followed by two "=" * padding characters, or (3) the final quantum of encoding input is * exactly 16 bits; here, the final unit of encoded output will be three * characters followed by one "=" padding character.

* *

Because it is used only for padding at the end of the data, the * occurrence of any "=" characters may be taken as evidence that the * end of the data has been reached (without truncation in transit). No * such assurance is possible, however, when the number of octets * transmitted was a multiple of three and no "=" characters are * present.

* *

Any characters outside of the base64 alphabet are to be ignored in * base64-encoded data.

* *

Care must be taken to use the proper octets for line breaks if base64 * encoding is applied directly to text material that has not been * converted to canonical form. In particular, text line breaks must be * converted into CRLF sequences prior to base64 encoding. The * important thing to note is that this may be done directly by the * encoder rather than in a prior canonization step in some * implementations.

* *

NOTE: There is no need to worry about quoting potential boundary * delimiters within base64-encoded bodies within multipart entities * because no hyphen characters are used in the base64 encoding.

*
* * @author Stephen Ostermiller http://ostermiller.org/contact.pl?regarding=Java+Utilities * @since ostermillerutils 1.00.00 */ public class Base64 { /** * Symbol that represents the end of an input stream * * @since ostermillerutils 1.00.00 */ private static final int END_OF_INPUT = -1; /** * A character that is not a valid base 64 character. * * @since ostermillerutils 1.00.00 */ private static final int NON_BASE_64 = -1; /** * A character that is not a valid base 64 character. * * @since ostermillerutils 1.00.00 */ private static final int NON_BASE_64_WHITESPACE = -2; /** * A character that is not a valid base 64 character. * * @since ostermillerutils 1.00.00 */ private static final int NON_BASE_64_PADDING = -3; /** * This class need not be instantiated, all methods are static. * * @since ostermillerutils 1.00.00 */ private Base64(){ } /** * Table of the sixty-four characters that are used as * the Base64 alphabet: [A-Za-z0-9+/] * * @since ostermillerutils 1.00.00 */ protected static final byte[] base64Chars = { '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','+','/', }; /** * Reverse lookup table for the Base64 alphabet. * reversebase64Chars[byte] gives n for the nth Base64 * character or negative if a character is not a Base64 character. * * @since ostermillerutils 1.00.00 */ protected static final byte[] reverseBase64Chars = new byte[0x100]; static { // Fill in NON_BASE_64 for all characters to start with for (int i=0; i", "-f --" + labels.getString("force.option"), "--" + labels.getString("noforce.option"), "-v --" + labels.getString("verbose.option"), "-q --" + labels.getString("quiet.option"), "-Q --" + labels.getString("reallyquiet.option"), "--" + labels.getString("file.option"), "--" + labels.getString("string.option"), "-n --" + labels.getString("newline.option"), "--" + labels.getString("nonewline.option"), }; int maxLength = 0; for (int i=0; i\n" + labels.getString("purpose.message") + "\n" + " " + labels.getString("stdin.message") + "\n" + " " + StringHelper.postpad(helpFlags[0] ,maxLength, ' ') + labels.getString("help.message") + "\n" + " " + StringHelper.postpad(helpFlags[1] ,maxLength, ' ') + labels.getString("version.message") + "\n" + " " + StringHelper.postpad(helpFlags[2] ,maxLength, ' ') + labels.getString("about.message") + "\n" + " " + StringHelper.postpad(helpFlags[3] ,maxLength, ' ') + labels.getString("g.message") + " (" + labels.getString("default") + ")\n" + " " + StringHelper.postpad(helpFlags[4] ,maxLength, ' ') + labels.getString("e.message") + "\n" + " " + StringHelper.postpad(helpFlags[5] ,maxLength, ' ') + labels.getString("l.message") + " (" + labels.getString("default") + ")\n" + " " + StringHelper.postpad(helpFlags[6] ,maxLength, ' ') + labels.getString("nolines.message") + "\n" + " " + StringHelper.postpad(helpFlags[7] ,maxLength, ' ') + labels.getString("d.message") + "\n" + " " + StringHelper.postpad(helpFlags[8] ,maxLength, ' ') + labels.getString("a.message") + "\n" + " " + StringHelper.postpad(helpFlags[9] ,maxLength, ' ') + labels.getString("decodegood.message") + " (" + labels.getString("default") + ")\n" + " " + StringHelper.postpad(helpFlags[10] ,maxLength, ' ') + labels.getString("x.message") + "\n" + " " + StringHelper.postpad(helpFlags[11] ,maxLength, ' ') + labels.getString("f.message") + "\n" + " " + StringHelper.postpad(helpFlags[12] ,maxLength, ' ') + labels.getString("noforce.message") + " (" + labels.getString("default") + ")\n" + " " + StringHelper.postpad(helpFlags[13] ,maxLength, ' ') + labels.getString("v.message") + " (" + labels.getString("default") + ")\n" + " " + StringHelper.postpad(helpFlags[14] ,maxLength, ' ') + labels.getString("q.message") + "\n" + " " + StringHelper.postpad(helpFlags[15] ,maxLength, ' ') + labels.getString("Q.message") + "\n" + " " + StringHelper.postpad(helpFlags[16] ,maxLength, ' ') + labels.getString("file.message") + "\n" + " " + StringHelper.postpad(helpFlags[17] ,maxLength, ' ') + labels.getString("string.message") + "\n" + " " + StringHelper.postpad(helpFlags[18] ,maxLength, ' ') + labels.getString("newline.message") + "\n" + " " + StringHelper.postpad(helpFlags[19] ,maxLength, ' ') + labels.getString("nonewline.message") + "\n" ); System.exit(0); } break; case 2:{ // print out the version message System.out.println(MessageFormat.format(labels.getString("version"), (Object[])new String[] {version})); System.exit(0); } break; case 3:{ System.out.println( labels.getString("base64") + " -- " + labels.getString("purpose.message") + "\n" + MessageFormat.format(labels.getString("copyright"), (Object[])new String[] {"2001-2002", "Stephen Ostermiller (http://ostermiller.org/contact.pl?regarding=Java+Utilities)"}) + "\n\n" + labels.getString("license") ); System.exit(0); } break; case 'd':{ action = ACTION_DECODE; } break; case 'a':{ forceDecode = true; } break; case 5:{ forceDecode = false; } break; case 'e':{ action = ACTION_ENCODE; } break; case 'l':{ lineBreaks = true; } break; case 6:{ lineBreaks = false; } break; case 'g':{ action = ACTION_GUESS; } break; case 'x':{ extension = opts.getOptarg(); if (extension == null) extension = ""; } break; case 'f':{ force = true; } break; case 4:{ force = false; } break; case 'v':{ printMessages = true; printErrors = true; } break; case 'q':{ printMessages = false; printErrors = true; } break; case 'Q':{ printMessages = false; printErrors = false; } break; case 7: { argumentType = ARGUMENT_FILE; } break; case 8: { argumentType = ARGUMENT_STRING; } break; case 'n': { decodeEndLine = true; } break; case 9: { decodeEndLine = false; } break; default:{ System.err.println(labels.getString("unknownarg")); System.exit(1); } } } int exitCond = 0; boolean done = false; for (int i=opts.getOptind(); i 0){ if (fileAction == ACTION_ENCODE){ outName = args[i] + "." + extension; } else { if (args[i].endsWith("." + extension)){ outName = args[i].substring(0, args[i].length() - (extension.length() + 1)); } } } File outFile = new File(outName); if (!force && outFile.exists()){ if(printErrors){ System.err.println(MessageFormat.format(labels.getString("overwrite"), (Object[])new String[] {outName})); } exitCond = 1; } else if (!(outFile.exists() || outFile.createNewFile()) || !outFile.canWrite()){ if(printErrors){ System.err.println(MessageFormat.format(labels.getString("cantwrite"), (Object[])new String[] {outName})); } exitCond = 1; } else { if (fileAction == ACTION_ENCODE){ if (printMessages){ System.out.println(MessageFormat.format(labels.getString("encoding"), (Object[])new String[] {args[i], outName})); } encode(source, outFile, lineBreaks); } else { if (printMessages){ System.out.println(MessageFormat.format(labels.getString("decoding"), (Object[])new String[] {args[i], outName})); } decode(source, outFile, !forceDecode); } } } catch (Base64DecodingException x){ if(printErrors){ System.err.println(args[i] + ": " + x.getMessage() + " " + labels.getString("unexpectedcharforce")); } exitCond = 1; } catch (IOException x){ if(printErrors){ System.err.println(args[i] + ": " + x.getMessage()); } exitCond = 1; } } } if (!done){ try { if (action == ACTION_GUESS){ if(printErrors){ System.err.println(labels.getString("cantguess")); } exitCond = 1; } else if (action == ACTION_ENCODE){ encode( new BufferedInputStream(System.in), new BufferedOutputStream(System.out), lineBreaks ); } else { decode( new BufferedInputStream(System.in), new BufferedOutputStream(System.out), !forceDecode ); if (decodeEndLine) System.out.println(); } } catch (Base64DecodingException x){ if(printErrors){ System.err.println(x.getMessage() + " " + labels.getString("unexpectedcharforce")); } exitCond = 1; } catch (IOException x){ if(printErrors){ System.err.println(x.getMessage()); } exitCond = 1; } } System.exit(exitCond); } /** * Encode a String in Base64. * The String is converted to and from bytes according to the platform's * default character encoding. * No line breaks or other white space are inserted into the encoded data. * * @param string The data to encode. * @return An encoded String. * * @since ostermillerutils 1.00.00 */ public static String encode(String string){ return new String(encode(string.getBytes())); } /** * Encode a String in Base64. * No line breaks or other white space are inserted into the encoded data. * * @param string The data to encode. * @param enc Character encoding to use when converting to and from bytes. * @throws UnsupportedEncodingException if the character encoding specified is not supported. * @return An encoded String. * * @since ostermillerutils 1.00.00 */ public static String encode(String string, String enc) throws UnsupportedEncodingException { return new String(encode(string.getBytes(enc)), enc); } /** * Encode bytes in Base64. * No line breaks or other white space are inserted into the encoded data. * * @param bytes The data to encode. * @return String with Base64 encoded data. * * @since ostermillerutils 1.04.00 */ public static String encodeToString(byte[] bytes){ return encodeToString(bytes, false); } /** * Encode bytes in Base64. * * @param bytes The data to encode. * @param lineBreaks Whether to insert line breaks every 76 characters in the output. * @return String with Base64 encoded data. * * @since ostermillerutils 1.04.00 */ public static String encodeToString(byte[] bytes, boolean lineBreaks){ try { return new String(encode(bytes, lineBreaks), "ASCII"); } catch (UnsupportedEncodingException iex){ // ASCII should be supported throw new RuntimeException(iex); } } /** * Encode bytes in Base64. * No line breaks or other white space are inserted into the encoded data. * * @param bytes The data to encode. * @return Encoded bytes. * * @since ostermillerutils 1.00.00 */ public static byte[] encode(byte[] bytes){ return encode(bytes, false); } /** * Encode bytes in Base64. * * @param bytes The data to encode. * @param lineBreaks Whether to insert line breaks every 76 characters in the output. * @return Encoded bytes. * * @since ostermillerutils 1.04.00 */ public static byte[] encode(byte[] bytes, boolean lineBreaks){ ByteArrayInputStream in = new ByteArrayInputStream(bytes); // calculate the length of the resulting output. // in general it will be 4/3 the size of the input // but the input length must be divisible by three. // If it isn't the next largest size that is divisible // by three is used. int mod; int length = bytes.length; if ((mod = length % 3) != 0){ length += 3 - mod; } length = length * 4 / 3; ByteArrayOutputStream out = new ByteArrayOutputStream(length); try { encode(in, out, lineBreaks); } catch (IOException x){ // This can't happen. // The input and output streams were constructed // on memory structures that don't actually use IO. throw new RuntimeException(x); } return out.toByteArray(); } /** * Encode this file in Base64. * Line breaks will be inserted every 76 characters. * * @param fIn File to be encoded (will be overwritten). * * @since ostermillerutils 1.00.00 */ public static void encode(File fIn) throws IOException { encode(fIn, fIn, true); } /** * Encode this file in Base64. * * @param fIn File to be encoded (will be overwritten). * @param lineBreaks Whether to insert line breaks every 76 characters in the output. * @throws IOException if an input or output error occurs. * * @since ostermillerutils 1.00.00 */ public static void encode(File fIn, boolean lineBreaks) throws IOException { encode(fIn, fIn, lineBreaks); } /** * Encode this file in Base64. * Line breaks will be inserted every 76 characters. * * @param fIn File to be encoded. * @param fOut File to which the results should be written (may be the same as fIn). * @throws IOException if an input or output error occurs. * * @since ostermillerutils 1.00.00 */ public static void encode(File fIn, File fOut) throws IOException { encode(fIn, fOut, true); } /** * Encode this file in Base64. * * @param fIn File to be encoded. * @param fOut File to which the results should be written (may be the same as fIn). * @param lineBreaks Whether to insert line breaks every 76 characters in the output. * @throws IOException if an input or output error occurs. * * @since ostermillerutils 1.00.00 */ public static void encode(File fIn, File fOut, boolean lineBreaks) throws IOException { File temp = null; InputStream in = null; OutputStream out = null; try { in = new BufferedInputStream(new FileInputStream(fIn)); temp = File.createTempFile("Base64", null, null); out = new BufferedOutputStream(new FileOutputStream(temp)); encode(in, out, lineBreaks); in.close(); in = null; out.flush(); out.close(); out = null; FileHelper.move(temp, fOut, true); } finally { if (in != null){ in.close(); in = null; } if (out != null){ out.flush(); out.close(); out = null; } } } /** * Encode data from the InputStream to the OutputStream in Base64. * Line breaks are inserted every 76 characters in the output. * * @param in Stream from which to read data that needs to be encoded. * @param out Stream to which to write encoded data. * @throws IOException if there is a problem reading or writing. * * @since ostermillerutils 1.00.00 */ public static void encode(InputStream in, OutputStream out) throws IOException { encode(in, out, true); } /** * Encode data from the InputStream to the OutputStream in Base64. * * @param in Stream from which to read data that needs to be encoded. * @param out Stream to which to write encoded data. * @param lineBreaks Whether to insert line breaks every 76 characters in the output. * @throws IOException if there is a problem reading or writing. * * @since ostermillerutils 1.00.00 */ public static void encode(InputStream in, OutputStream out, boolean lineBreaks) throws IOException { // Base64 encoding converts three bytes of input to // four bytes of output int[] inBuffer = new int[3]; int lineCount = 0; boolean done = false; while (!done && (inBuffer[0] = in.read()) != END_OF_INPUT){ // Fill the buffer inBuffer[1] = in.read(); inBuffer[2] = in.read(); // Calculate the out Buffer // The first byte of our in buffer will always be valid // but we must check to make sure the other two bytes // are not END_OF_INPUT before using them. // The basic idea is that the three bytes get split into // four bytes along these lines: // [AAAAAABB] [BBBBCCCC] [CCDDDDDD] // [xxAAAAAA] [xxBBBBBB] [xxCCCCCC] [xxDDDDDD] // bytes are considered to be zero when absent. // the four bytes are then mapped to common ASCII symbols // A's: first six bits of first byte out.write(base64Chars[ inBuffer[0] >> 2 ]); if (inBuffer[1] != END_OF_INPUT){ // B's: last two bits of first byte, first four bits of second byte out.write(base64Chars [(( inBuffer[0] << 4 ) & 0x30) | (inBuffer[1] >> 4) ]); if (inBuffer[2] != END_OF_INPUT){ // C's: last four bits of second byte, first two bits of third byte out.write(base64Chars [((inBuffer[1] << 2) & 0x3c) | (inBuffer[2] >> 6) ]); // D's: last six bits of third byte out.write(base64Chars [inBuffer[2] & 0x3F]); } else { // C's: last four bits of second byte out.write(base64Chars [((inBuffer[1] << 2) & 0x3c)]); // an equals sign for a character that is not a Base64 character out.write('='); done = true; } } else { // B's: last two bits of first byte out.write(base64Chars [(( inBuffer[0] << 4 ) & 0x30)]); // an equal signs for characters that is not a Base64 characters out.write('='); out.write('='); done = true; } lineCount += 4; if (lineBreaks && lineCount >= 76){ out.write('\n'); lineCount = 0; } } if (lineBreaks && lineCount >= 1){ out.write('\n'); lineCount = 0; } out.flush(); } /** * Decode a Base64 encoded String. * Characters that are not part of the Base64 alphabet are ignored * in the input. * The String is converted to and from bytes according to the platform's * default character encoding. * * @param string The data to decode. * @return A decoded String. * * @since ostermillerutils 1.00.00 */ public static String decode(String string){ return new String(decode(string.getBytes())); } /** * Decode a Base64 encoded String. * Characters that are not part of the Base64 alphabet are ignored * in the input. * * @param string The data to decode. * @param enc Character encoding to use when converting to and from bytes. * @throws UnsupportedEncodingException if the character encoding specified is not supported. * @return A decoded String. * * @since ostermillerutils 1.00.00 */ public static String decode(String string, String enc) throws UnsupportedEncodingException { return new String(decode(string.getBytes(enc)), enc); } /** * Decode a Base64 encoded String. * Characters that are not part of the Base64 alphabet are ignored * in the input. * * @param string The data to decode. * @param encIn Character encoding to use when converting input to bytes (should not matter because Base64 data is designed to survive most character encodings) * @param encOut Character encoding to use when converting decoded bytes to output. * @throws UnsupportedEncodingException if the character encoding specified is not supported. * @return A decoded String. * * @since ostermillerutils 1.00.00 */ public static String decode(String string, String encIn, String encOut) throws UnsupportedEncodingException { return new String(decode(string.getBytes(encIn)), encOut); } /** * Decode a Base64 encoded String. * Characters that are not part of the Base64 alphabet are ignored * in the input. * The String is converted to and from bytes according to the platform's * default character encoding. * * @param string The data to decode. * @return A decoded String. * * @since ostermillerutils 1.02.16 */ public static String decodeToString(String string){ return new String(decode(string.getBytes())); } /** * Decode a Base64 encoded String. * Characters that are not part of the Base64 alphabet are ignored * in the input. * * @param string The data to decode. * @param enc Character encoding to use when converting to and from bytes. * @throws UnsupportedEncodingException if the character encoding specified is not supported. * @return A decoded String. * * @since ostermillerutils 1.02.16 */ public static String decodeToString(String string, String enc) throws UnsupportedEncodingException { return new String(decode(string.getBytes(enc)), enc); } /** * Decode a Base64 encoded String. * Characters that are not part of the Base64 alphabet are ignored * in the input. * * @param string The data to decode. * @param encIn Character encoding to use when converting input to bytes (should not matter because Base64 data is designed to survive most character encodings) * @param encOut Character encoding to use when converting decoded bytes to output. * @throws UnsupportedEncodingException if the character encoding specified is not supported. * @return A decoded String. * * @since ostermillerutils 1.02.16 */ public static String decodeToString(String string, String encIn, String encOut) throws UnsupportedEncodingException { return new String(decode(string.getBytes(encIn)), encOut); } /** * Decode a Base64 encoded String to an OutputStream. * Characters that are not part of the Base64 alphabet are ignored * in the input. * The String is converted from bytes according to the platform's * default character encoding. * * @param string The data to decode. * @param out Stream to which to write decoded data. * @throws IOException if an IO error occurs. * * @since ostermillerutils 1.02.16 */ public static void decodeToStream(String string, OutputStream out) throws IOException { decode(new ByteArrayInputStream(string.getBytes()), out); } /** * Decode a Base64 encoded String to an OutputStream. * Characters that are not part of the Base64 alphabet are ignored * in the input. * * @param string The data to decode. * @param enc Character encoding to use when converting to and from bytes. * @param out Stream to which to write decoded data. * @throws UnsupportedEncodingException if the character encoding specified is not supported. * @throws IOException if an IO error occurs. * * @since ostermillerutils 1.02.16 */ public static void decodeToStream(String string, String enc, OutputStream out) throws UnsupportedEncodingException, IOException { decode(new ByteArrayInputStream(string.getBytes(enc)), out); } /** * Decode a Base64 encoded String. * Characters that are not part of the Base64 alphabet are ignored * in the input. * The String is converted from bytes according to the platform's * default character encoding. * * @param string The data to decode. * @return decoded data. * * @since ostermillerutils 1.02.16 */ public static byte[] decodeToBytes(String string){ return decode(string.getBytes()); } /** * Decode a Base64 encoded String. * Characters that are not part of the Base64 alphabet are ignored * in the input. * * @param string The data to decode. * @param enc Character encoding to use when converting from bytes. * @throws UnsupportedEncodingException if the character encoding specified is not supported. * @return decoded data. * * @since ostermillerutils 1.02.16 */ public static byte[] decodeToBytes(String string, String enc) throws UnsupportedEncodingException { return decode(string.getBytes(enc)); } /** * Decode Base64 encoded bytes. * Characters that are not part of the Base64 alphabet are ignored * in the input. * The String is converted to bytes according to the platform's * default character encoding. * * @param bytes The data to decode. * @return A decoded String. * * @since ostermillerutils 1.02.16 */ public static String decodeToString(byte[] bytes){ return new String(decode(bytes)); } /** * Decode Base64 encoded bytes. * Characters that are not part of the Base64 alphabet are ignored * in the input. * * @param bytes The data to decode. * @param enc Character encoding to use when converting to and from bytes. * @throws UnsupportedEncodingException if the character encoding specified is not supported. * @return A decoded String. * * @since ostermillerutils 1.02.16 */ public static String decodeToString(byte[] bytes, String enc) throws UnsupportedEncodingException { return new String(decode(bytes), enc); } /** * Decode Base64 encoded bytes. * Characters that are not part of the Base64 alphabet are ignored * in the input. * * @param bytes The data to decode. * @return Decoded bytes. * * @since ostermillerutils 1.02.16 */ public static byte[] decodeToBytes(byte[] bytes){ return decode(bytes); } /** * Decode Base64 encoded bytes. * Characters that are not part of the Base64 alphabet are ignored * in the input. * * @param bytes The data to decode. * @return Decoded bytes. * * @since ostermillerutils 1.00.00 */ public static byte[] decode(byte[] bytes){ ByteArrayInputStream in = new ByteArrayInputStream(bytes); // calculate the length of the resulting output. // in general it will be at most 3/4 the size of the input // but the input length must be divisible by four. // If it isn't the next largest size that is divisible // by four is used. int mod; int length = bytes.length; if ((mod = length % 4) != 0){ length += 4 - mod; } length = length * 3 / 4; ByteArrayOutputStream out = new ByteArrayOutputStream(length); try { decode(in, out, false); } catch (IOException x){ // This can't happen. // The input and output streams were constructed // on memory structures that don't actually use IO. throw new RuntimeException(x); } return out.toByteArray(); } /** * Decode Base64 encoded bytes to the an OutputStream. * Characters that are not part of the Base64 alphabet are ignored * in the input. * * @param bytes The data to decode. * @param out Stream to which to write decoded data. * @throws IOException if an IO error occurs. * * @since ostermillerutils 1.00.00 */ public static void decode(byte[] bytes, OutputStream out) throws IOException { ByteArrayInputStream in = new ByteArrayInputStream(bytes); decode(in, out, false); } /** * Decode Base64 encoded bytes to the an OutputStream. * Characters that are not part of the Base64 alphabet are ignored * in the input. * * @param bytes The data to decode. * @param out Stream to which to write decoded data. * @throws IOException if an IO error occurs. * * @since ostermillerutils 1.02.16 */ public static void decodeToStream(byte[] bytes, OutputStream out) throws IOException { ByteArrayInputStream in = new ByteArrayInputStream(bytes); decode(in, out, false); } /** * Decode Base64 encoded data from one file to the other. * Characters in the Base64 alphabet, white space and equals sign are * expected to be in urlencoded data. The presence of other characters * could be a sign that the data is corrupted. * * @param fIn File to be decoded (will be overwritten). * @throws IOException if an IO error occurs. * @throws Base64DecodingException if unexpected data is encountered. * * @since ostermillerutils 1.00.00 */ public static void decode(File fIn) throws IOException { decode(fIn, fIn, true); } /** * Decode Base64 encoded data from one file to the other. * Characters in the Base64 alphabet, white space and equals sign are * expected to be in urlencoded data. The presence of other characters * could be a sign that the data is corrupted. * * @param fIn File to be decoded (will be overwritten). * @param throwExceptions Whether to throw exceptions when unexpected data is encountered. * @throws IOException if an IO error occurs. * @throws Base64DecodingException if unexpected data is encountered when throwExceptions is specified. * * @since ostermillerutils 1.00.00 */ public static void decode(File fIn, boolean throwExceptions) throws IOException { decode(fIn, fIn, throwExceptions); } /** * Decode Base64 encoded data from one file to the other. * Characters in the Base64 alphabet, white space and equals sign are * expected to be in urlencoded data. The presence of other characters * could be a sign that the data is corrupted. * * @param fIn File to be decoded. * @param fOut File to which the results should be written (may be the same as fIn). * @throws IOException if an IO error occurs. * @throws Base64DecodingException if unexpected data is encountered. * * @since ostermillerutils 1.00.00 */ public static void decode(File fIn, File fOut) throws IOException { decode(fIn, fOut, true); } /** * Decode Base64 encoded data from one file to the other. * Characters in the Base64 alphabet, white space and equals sign are * expected to be in urlencoded data. The presence of other characters * could be a sign that the data is corrupted. * * @param fIn File to be decoded. * @param fOut File to which the results should be written (may be the same as fIn). * @param throwExceptions Whether to throw exceptions when unexpected data is encountered. * @throws IOException if an IO error occurs. * @throws Base64DecodingException if unexpected data is encountered when throwExceptions is specified. * * @since ostermillerutils 1.00.00 */ public static void decode(File fIn, File fOut, boolean throwExceptions) throws IOException { File temp = null; InputStream in = null; OutputStream out = null; try { in = new BufferedInputStream(new FileInputStream(fIn)); temp = File.createTempFile("Base64", null, null); out = new BufferedOutputStream(new FileOutputStream(temp)); decode(in, out, throwExceptions); in.close(); in = null; out.flush(); out.close(); out = null; FileHelper.move(temp, fOut, true); } finally { if (in != null){ try { in.close(); } catch (IOException ignore){ if (throwExceptions) throw ignore; } in = null; } if (out != null){ try { out.flush(); out.close(); } catch (IOException ignore){ if (throwExceptions) throw ignore; } out = null; } } } /** * Reads the next (decoded) Base64 character from the input stream. * Non Base64 characters are skipped. * * @param in Stream from which bytes are read. * @param throwExceptions Throw an exception if an unexpected character is encountered. * @return the next Base64 character from the stream or -1 if there are no more Base64 characters on the stream. * @throws IOException if an IO Error occurs. * @throws Base64DecodingException if unexpected data is encountered when throwExceptions is specified. * * @since ostermillerutils 1.00.00 */ private static final int readBase64(InputStream in, boolean throwExceptions) throws IOException { int read; int numPadding = 0; do { read = in.read(); if (read == END_OF_INPUT) return END_OF_INPUT; read = reverseBase64Chars[(byte)read]; if (throwExceptions && (read == NON_BASE_64 || (numPadding > 0 && read > NON_BASE_64))){ throw new Base64DecodingException ( MessageFormat.format( labels.getString("unexpectedchar"), (Object[])new String[] { "'" + (char)read + "' (0x" + Integer.toHexString(read) + ")" } ), (char)read ); } if (read == NON_BASE_64_PADDING){ numPadding++; } } while (read <= NON_BASE_64); return read; } /** * Decode Base64 encoded data from the InputStream to a byte array. * Characters that are not part of the Base64 alphabet are ignored * in the input. * * @param in Stream from which to read data that needs to be decoded. * @return decoded data. * @throws IOException if an IO error occurs. * * @since ostermillerutils 1.00.00 */ public static byte[] decodeToBytes(InputStream in) throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(); decode(in, out, false); return out.toByteArray(); } /** * Decode Base64 encoded data from the InputStream to a String. * Characters that are not part of the Base64 alphabet are ignored * in the input. * Bytes are converted to characters in the output String according to the platform's * default character encoding. * * @param in Stream from which to read data that needs to be decoded. * @return decoded data. * @throws IOException if an IO error occurs. * * @since ostermillerutils 1.02.16 */ public static String decodeToString(InputStream in) throws IOException { return new String(decodeToBytes(in)); } /** * Decode Base64 encoded data from the InputStream to a String. * Characters that are not part of the Base64 alphabet are ignored * in the input. * * @param in Stream from which to read data that needs to be decoded. * @param enc Character encoding to use when converting bytes to characters. * @return decoded data. * @throws IOException if an IO error occurs.Throws: * @throws UnsupportedEncodingException if the character encoding specified is not supported. * * @since ostermillerutils 1.02.16 */ public static String decodeToString(InputStream in, String enc) throws IOException { return new String(decodeToBytes(in), enc); } /** * Decode Base64 encoded data from the InputStream to the OutputStream. * Characters in the Base64 alphabet, white space and equals sign are * expected to be in urlencoded data. The presence of other characters * could be a sign that the data is corrupted. * * @param in Stream from which to read data that needs to be decoded. * @param out Stream to which to write decoded data. * @throws IOException if an IO error occurs. * @throws Base64DecodingException if unexpected data is encountered. * * @since ostermillerutils 1.00.00 */ public static void decode(InputStream in, OutputStream out) throws IOException { decode(in, out, true); } /** * Decode Base64 encoded data from the InputStream to the OutputStream. * Characters in the Base64 alphabet, white space and equals sign are * expected to be in urlencoded data. The presence of other characters * could be a sign that the data is corrupted. * * @param in Stream from which to read data that needs to be decoded. * @param out Stream to which to write decoded data. * @param throwExceptions Whether to throw exceptions when unexpected data is encountered. * @throws IOException if an IO error occurs. * @throws Base64DecodingException if unexpected data is encountered when throwExceptions is specified. * * @since ostermillerutils 1.00.00 */ public static void decode(InputStream in, OutputStream out, boolean throwExceptions) throws IOException { // Base64 decoding converts four bytes of input to three bytes of output int[] inBuffer = new int[4]; // read bytes unmapping them from their ASCII encoding in the process // we must read at least two bytes to be able to output anything boolean done = false; while (!done && (inBuffer[0] = readBase64(in, throwExceptions)) != END_OF_INPUT && (inBuffer[1] = readBase64(in, throwExceptions)) != END_OF_INPUT){ // Fill the buffer inBuffer[2] = readBase64(in, throwExceptions); inBuffer[3] = readBase64(in, throwExceptions); // Calculate the output // The first two bytes of our in buffer will always be valid // but we must check to make sure the other two bytes // are not END_OF_INPUT before using them. // The basic idea is that the four bytes will get reconstituted // into three bytes along these lines: // [xxAAAAAA] [xxBBBBBB] [xxCCCCCC] [xxDDDDDD] // [AAAAAABB] [BBBBCCCC] [CCDDDDDD] // bytes are considered to be zero when absent. // six A and two B out.write(inBuffer[0] << 2 | inBuffer[1] >> 4); if (inBuffer[2] != END_OF_INPUT){ // four B and four C out.write(inBuffer[1] << 4 | inBuffer[2] >> 2); if (inBuffer[3] != END_OF_INPUT){ // two C and six D out.write(inBuffer[2] << 6 | inBuffer[3]); } else { done = true; } } else { done = true; } } out.flush(); } /** * Determines if the byte array is in base64 format. *

* Data will be considered to be in base64 format if it contains * only base64 characters and whitespace with equals sign padding * on the end so that the number of base64 characters is divisible * by four. *

* It is possible for data to be in base64 format but for it to not * meet these stringent requirements. It is also possible for data * to meet these requirements even though decoding it would not make * any sense. This method should be used as a guide but it is not * authoritative because of the possibility of these false positives * and false negatives. *

* Additionally, extra data such as headers or footers may throw * this method off the scent and cause it to return false. * * @param bytes data that could be in base64 format. * * @since ostermillerutils 1.00.00 */ public static boolean isBase64(byte[] bytes){ try { return isBase64(new ByteArrayInputStream(bytes)); } catch (IOException x){ // This can't happen. // The input and output streams were constructed // on memory structures that don't actually use IO. return false; } } /** * Determines if the String is in base64 format. * The String is converted to and from bytes according to the platform's * default character encoding. *

* Data will be considered to be in base64 format if it contains * only base64 characters and whitespace with equals sign padding * on the end so that the number of base64 characters is divisible * by four. *

* It is possible for data to be in base64 format but for it to not * meet these stringent requirements. It is also possible for data * to meet these requirements even though decoding it would not make * any sense. This method should be used as a guide but it is not * authoritative because of the possibility of these false positives * and false negatives. *

* Additionally, extra data such as headers or footers may throw * this method off the scent and cause it to return false. * * @param string String that may be in base64 format. * @return Best guess as to whether the data is in base64 format. * * @since ostermillerutils 1.00.00 */ public static boolean isBase64(String string){ return isBase64(string.getBytes()); } /** * Determines if the String is in base64 format. *

* Data will be considered to be in base64 format if it contains * only base64 characters and whitespace with equals sign padding * on the end so that the number of base64 characters is divisible * by four. *

* It is possible for data to be in base64 format but for it to not * meet these stringent requirements. It is also possible for data * to meet these requirements even though decoding it would not make * any sense. This method should be used as a guide but it is not * authoritative because of the possibility of these false positives * and false negatives. *

* Additionally, extra data such as headers or footers may throw * this method off the scent and cause it to return false. * * @param string String that may be in base64 format. * @param enc Character encoding to use when converting to bytes. * @return Best guess as to whether the data is in base64 format. * @throws UnsupportedEncodingException if the character encoding specified is not supported. */ public static boolean isBase64(String string, String enc) throws UnsupportedEncodingException { return isBase64(string.getBytes(enc)); } /** * Determines if the File is in base64 format. *

* Data will be considered to be in base64 format if it contains * only base64 characters and whitespace with equals sign padding * on the end so that the number of base64 characters is divisible * by four. *

* It is possible for data to be in base64 format but for it to not * meet these stringent requirements. It is also possible for data * to meet these requirements even though decoding it would not make * any sense. This method should be used as a guide but it is not * authoritative because of the possibility of these false positives * and false negatives. *

* Additionally, extra data such as headers or footers may throw * this method off the scent and cause it to return false. * * @param fIn File that may be in base64 format. * @return Best guess as to whether the data is in base64 format. * @throws IOException if an IO error occurs. * * @since ostermillerutils 1.00.00 */ public static boolean isBase64(File fIn) throws IOException { return isBase64(new BufferedInputStream(new FileInputStream(fIn))); } /** * Reads data from the stream and determines if it is * in base64 format. *

* Data will be considered to be in base64 format if it contains * only base64 characters and whitespace with equals sign padding * on the end so that the number of base64 characters is divisible * by four. *

* It is possible for data to be in base64 format but for it to not * meet these stringent requirements. It is also possible for data * to meet these requirements even though decoding it would not make * any sense. This method should be used as a guide but it is not * authoritative because of the possibility of these false positives * and false negatives. *

* Additionally, extra data such as headers or footers may throw * this method off the scent and cause it to return false. * * @param in Stream from which to read data to be tested. * @return Best guess as to whether the data is in base64 format. * @throws IOException if an IO error occurs. * * @since ostermillerutils 1.00.00 */ public static boolean isBase64(InputStream in) throws IOException { long numBase64Chars = 0; int numPadding = 0; int read; while ((read = in.read()) != -1){ read = reverseBase64Chars[read]; if (read == NON_BASE_64){ return false; } else if (read == NON_BASE_64_WHITESPACE){ } else if (read == NON_BASE_64_PADDING){ numPadding++; numBase64Chars++; } else if (numPadding > 0){ return false; } else { numBase64Chars++; } } if (numBase64Chars == 0) return false; if (numBase64Chars % 4 != 0) return false; return true; } }


4.MD5:

MD5是一个安全的散列算法,有两个特点:
1、输入两个不同的明文(一段原始的数字信息)不会得到相同的输出值
2、根据输出值,不能得到原始的明文,即过程不可逆
所以要解密MD5没有现成的算法,只能用穷举法,把可能出现的明文,用MD5算法散列之后,把得到的散列值和原始的数据形成一个一对一的映射表,然后在所谓的解密的时候,都是通过这个映射表来查找其所对应的原始明文。
而绝对没有一种算法,可以通过输出加密后的散列值算出原始明文。
http://zhidao.baidu.com/link?url=8GALGyzvERNGndKHHz-Ds54funzwR6PrUJ2NdXS55hNePcgRJEYc2Puh7o9-3x18F85aahGw0x5Z7NhjDUZJHq


package com.gootrip.util;

// Md5.java
// $Id: Md5.java,v 1.4 1999/12/06 13:13:58 ylafon Exp $
// (c) COPYRIGHT MIT and INRIA, 1996.
// Please first read the full copyright statement in file COPYRIGHT.html
// http://www.jq-school.com
// 
//		Add model hmac_Md5 ( String text , String key ) ;
//package md5java ;
import java.io.* ;

public class Md5 {
    private static final int BUFFER_SIZE = 1024 ;

    private static final int S11 = 7 ;
    private static final int S12 = 12 ;
    private static final int S13 = 17 ;
    private static final int S14 = 22 ;
    private static final int S21 = 5 ;
    private static final int S22 = 9 ;
    private static final int S23 = 14 ;
    private static final int S24 = 20 ;
    private static final int S31 = 4 ;
    private static final int S32 = 11 ;
    private static final int S33 = 16 ;
    private static final int S34 = 23 ;
    private static final int S41 = 6 ;
    private static final int S42 = 10 ;
    private static final int S43 = 15 ;
    private static final int S44 = 21 ;

    private static byte padding[] = {
        (byte) 0x80, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0,
        (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0,
        (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0,
        (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0,
        (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0,
        (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0,
        (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0,
        (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0,
        (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0,
        (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0,
        (byte) 0, (byte) 0, (byte) 0, (byte) 0
    } ;


    private InputStream in       = null ;
    private boolean     stringp  = false ;
    private int         state[]  = null ;
    private long        count    = 0 ;
    private byte        buffer[] = null ;
    private byte        digest[] = null ;

    public static String stringify (byte buf[]) {
        StringBuffer sb = new StringBuffer(2*buf.length) ;
        for (int i = 0 ; i < buf.length; i++) {
            int h = (buf[i] & 0xf0) >> 4 ;
            int l = (buf[i] & 0x0f) ;
            sb.append (new Character((char)((h>9) ? 'a'+h-10 : '0'+h))) ;
            sb.append (new Character((char)((l>9) ? 'a'+l-10 : '0'+l))) ;
        }
        return sb.toString() ;
    }

    private final int F(int x, int y, int z) {
        return ((x & y) | ((~x) & z)) ;
    }

    private final int G(int x, int y, int z) {
        return ((x & z) | (y & (~z))) ;
    }

    private final int H(int x, int y, int z) {
        return (x ^ y ^ z) ;
    }

    private final int I(int x, int y, int z) {
        return (y ^ (x | (~z))) ;
    }

    private final int  rotate_left(int x, int n) {
        return ((x << n) | (x >>> (32-n))) ;
    }

    private final int FF(int a,int b,int c,int d,int x,int s,int ac) {
        a += (F(b, c, d) + x + ac) ;
        a = rotate_left(a, s) ;
        a += b ;
        return a ;
    }

    private final int GG(int a,int b,int c,int d,int x,int s,int ac) {
        a += (G(b, c, d) + x + ac) ;
        a = rotate_left(a, s) ;
        a += b ;
        return a ;
    }

    private final int HH(int a,int b,int c,int d,int x,int s,int ac) {
        a += (H(b, c, d) + x + ac) ;
        a = rotate_left(a, s) ;
        a += b ;
        return a ;
    }

    private final int II(int a,int b,int c,int d,int x,int s,int ac) {
        a += (I(b, c, d) + x + ac) ;
        a = rotate_left(a, s) ;
        a += b ;
        return a;
    }

    private final void decode (int output[], byte input[], int off, int len) {
        int i = 0 ;
        int j = 0 ;
        for ( ; j < len; i++, j += 4) {
            output[i] = (((int) (input[off+j]&0xff))
                         | (((int) (input[off+j+1] & 0xff)) << 8)
                         | (((int) (input[off+j+2] & 0xff)) << 16)
                         | (((int) (input[off+j+3] & 0xff)) << 24)) ;
        }
    }

    private final void transform (byte block[], int offset) {
        int a   = state[0] ;
        int b   = state[1] ;
        int c   = state[2] ;
        int d   = state[3] ;
        int x[] = new int[16] ;

        decode (x, block, offset, 64);
        /* Round 1 */
        a = FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
        d = FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
        c = FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
        b = FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
        a = FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
        d = FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
        c = FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
        b = FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
        a = FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
        d = FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
        c = FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
        b = FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
        a = FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
        d = FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
        c = FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
        b = FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
        /* Round 2 */
        a = GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
        d = GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
        c = GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
        b = GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
        a = GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
        d = GG (d, a, b, c, x[10], S22,  0x2441453); /* 22 */
        c = GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
        b = GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
        a = GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
        d = GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
        c = GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */
        b = GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
        a = GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
        d = GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
        c = GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
        b = GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */

        /* Round 3 */
        a = HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
        d = HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
        c = HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
        b = HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
        a = HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
        d = HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
        c = HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
        b = HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
        a = HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
        d = HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
        c = HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
        b = HH (b, c, d, a, x[ 6], S34,  0x4881d05); /* 44 */
        a = HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
        d = HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
        c = HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
        b = HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */

        /* Round 4 */
        a = II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
        d = II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
        c = II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
        b = II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
        a = II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
        d = II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
        c = II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
        b = II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
        a = II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
        d = II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
        c = II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
        b = II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
        a = II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
        d = II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
        c = II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
        b = II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */

        state[0] += a;
        state[1] += b;
        state[2] += c;
        state[3] += d;
    }

    private final void update (byte input[], int len) {
        int index = ((int) (count >> 3)) & 0x3f ;
        count += (len << 3) ;
        int partLen = 64 - index ;
        int i = 0 ;
        if ( len >= partLen ) {
            System.arraycopy (input, 0, buffer, index, partLen) ;
            transform (buffer, 0) ;
            for (i = partLen ; i + 63 < len ; i+= 64)
                transform (input, i) ;
            index = 0 ;
        } else {
            i = 0 ;
        }
        System.arraycopy (input, i, buffer, index, len - i) ;
    }

    private byte[] end () {
        byte bits[] = new byte[8] ;
        for (int i = 0 ; i < 8 ; i++)
            bits[i] = (byte) ((count>>>(i*8)) & 0xff) ;
        int index  = ((int) (count >> 3)) & 0x3f ;
        int padlen = (index < 56) ? (56 - index) : (120 - index) ;
        update (padding, padlen) ;
        update (bits, 8) ;
        return encode(state, 16) ;
    }

    // Encode the content.state array into 16 bytes array
    private byte[] encode (int input[], int len) {
        byte output[] = new byte[len] ;
        int i = 0 ;
        int j = 0 ;
        for ( ; j < len ; i++, j+= 4) {
            output[j]   = (byte) ((input[i]      ) & 0xff) ;
            output[j+1] = (byte) ((input[i] >> 8 ) & 0xff) ;
            output[j+2] = (byte) ((input[i] >> 16) & 0xff) ;
            output[j+3] = (byte) ((input[i] >> 24) & 0xff) ;
        }
        return output ;
    }

    /**
     * Get the digest for our input stream.
     * This method constructs the input stream digest, and return it, as a
     * a String, following the MD5 (rfc1321) algorithm,
     * @return An instance of String, giving the message digest.
     * @exception IOException Thrown if the digestifier was unable to read the
     *    input stream.
     */

    public byte[] getDigest ()
        throws IOException
    {
        byte buffer[] = new byte[BUFFER_SIZE] ;
        int  got      = -1 ;

        if ( digest != null )
            return digest ;
        while ((got = in.read(buffer)) > 0 )
            update (buffer, got) ;
        this.digest = end () ;
        return digest ;
    }

    /**
     * Get the digest, for this string digestifier.
     * This method doesn't throw any IOException, since it knows that the
     * underlying stream ws built from a String.
     */

    public byte[] processString () {
        if ( ! stringp )
            throw new RuntimeException (this.getClass().getName()
                                        + "[processString]"
                                        + " not a string.") ;
        try {
            return getDigest() ;
        } catch (IOException ex) {
        }
        throw new RuntimeException (this.getClass().getName()
                                    + "[processString]"
                                    + ": implementation error.") ;
    }

    /**
     * Get the digest, as a proper string.
     */

    public String getStringDigest() {
        if ( digest == null )
            throw new RuntimeException (this.getClass().getName()
                                        + "[getStringDigest]"
                                        + ": called before processing.") ;
        return stringify (digest) ;
    }


    /**
     * Construct a digestifier for the given string.
     * @param input The string to be digestified.
     * @param encoding the encoding name used (such as UTF8)
     */

    public Md5 (String input, String enc) {
         byte bytes [] = null;
        try {
            bytes = input.getBytes (enc);
        } catch(UnsupportedEncodingException e){
            throw new RuntimeException("no "+enc+" encoding!!!");
        }
        this.stringp = true ;
        this.in      = new ByteArrayInputStream (bytes) ;
        this.state   = new int[4] ;
        this.buffer  = new byte[64] ;
        this.count   = 0 ;
        state[0] = 0x67452301;
        state[1] = 0xefcdab89;
        state[2] = 0x98badcfe;
        state[3] = 0x10325476;
    }

    /**
     * Construct a digestifier for the given string.
     * @param input The string to be digestified.
     */

    public Md5 (String input) {
        this(input, "UTF8");
    }

    /**
     * Construct a digestifier for the given input stream.
     * @param in The input stream to be digestified.
     */

    public Md5 (InputStream in) {
        this.stringp = false ;
        this.in      = in ;
        this.state   = new int[4] ;
        this.buffer  = new byte[64] ;
        this.count   = 0 ;
        state[0] = 0x67452301;
        state[1] = 0xefcdab89;
        state[2] = 0x98badcfe;
        state[3] = 0x10325476;
    }

        public void hmac_Md5 ( String text , String key )
        throws IOException {
                //byte disgest[] = new byte[16] ;
                //byte output[] = new byte[32] ;
                //output[33] = ( byte ) '\0' ;
                byte k_ipad[] = new byte[64] ;
                byte k_opad[] = new byte[64] ;
                //byte tk[] = new byte[16] ;
                byte key1 [] ;
                int i ;
                int text_len = text.getBytes().length ;
                int key_len = key.getBytes().length ;
                key1 = key.getBytes() ;

                if ( key_len > 64 ) {
                        key1 = new Md5( key ).getDigest() ;
                        key_len = 16 ;
                }

                for ( i = 0 ; i < 64 ; i++ )
                        k_ipad[i] = ( byte ) 0 ;
                for ( i = 0 ; i < 64 ; i++ )
                        k_opad[i] = ( byte ) 0 ;

                for ( i = 0 ; i < key_len ; i++ ) {
                        k_ipad[i] = ( byte ) key1[i] ;
                        k_opad[i] = ( byte ) key1[i] ;
                }

                for ( i = 0 ; i < 64 ; i++ ) {
                        k_ipad[i] ^= 0x36 ;
                        k_opad[i] ^= 0x5c ;
                }

                Md5 md5 = new Md5( "" ) ;
                md5.update( k_ipad , 64 ) ;
                md5.update( text.getBytes() , text_len ) ;
                digest = md5.getDigest() ;

                Md5 md51 = new Md5( "" ) ;
                md51.update( k_opad , 64 ) ;
                md51.update( digest , 16 ) ;
                digest = md51.getDigest() ;
        }



}


你可能感兴趣的:(java,操作系统,开发工具)