import java.io.UnsupportedEncodingException;
public class Blowfish   
{   
    private static final int[]   
        KP = {   
                0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344,   
                0xA4093822, 0x299F31D0, 0x082EFA98, 0xEC4E6C89,   
                0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C,   
                0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917,   
                0x9216D5D9, 0x8979FB1B  
             },   
  
        KS0 = {   
                0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7,   
                0xB8E1AFED, 0x6A267E96, 0xBA7C9045, 0xF12C7F99,   
                0x24A19947, 0xB3916CF7, 0x0801F2E2, 0x858EFC16,   
                0x636920D8, 0x71574E69, 0xA458FEA3, 0xF4933D7E,   
                0x0D95748F, 0x728EB658, 0x718BCD58, 0x82154AEE,   
                0x7B54A41D, 0xC25A59B5, 0x9C30D539, 0x2AF26013,   
                0xC5D1B023, 0x286085F0, 0xCA417918, 0xB8DB38EF,   
                0x8E79DCB0, 0x603A180E, 0x6C9E0E8B, 0xB01E8A3E,   
                0xD71577C1, 0xBD314B27, 0x78AF2FDA, 0x55605C60,   
                0xE65525F3, 0xAA55AB94, 0x57489862, 0x63E81440,   
                0x55CA396A, 0x2AAB10B6, 0xB4CC5C34, 0x1141E8CE,   
                0xA15486AF, 0x7C72E993, 0xB3EE1411, 0x636FBC2A,   
                0x2BA9C55D, 0x741831F6, 0xCE5C3E16, 0x9B87931E,   
                0xAFD6BA33, 0x6C24CF5C, 0x7A325381, 0x28958677,   
                0x3B8F4898, 0x6B4BB9AF, 0xC4BFE81B, 0x66282193,   
                0x61D809CC, 0xFB21A991, 0x487CAC60, 0x5DEC8032,   
                0xEF845D5D, 0xE98575B1, 0xDC262302, 0xEB651B88,   
                0x23893E81, 0xD396ACC5, 0x0F6D6FF3, 0x83F44239,   
                0x2E0B4482, 0xA4842004, 0x69C8F04A, 0x9E1F9B5E,   
                0x21C66842, 0xF6E96C9A, 0x670C9C61, 0xABD388F0,   
                0x6A51A0D2, 0xD8542F68, 0x960FA728, 0xAB5133A3,   
                0x6EEF0B6C, 0x137A3BE4, 0xBA3BF050, 0x7EFB2A98,   
                0xA1F1651D, 0x39AF0176, 0x66CA593E, 0x82430E88,   
                0x8CEE8619, 0x456F9FB4, 0x7D84A5C3, 0x3B8B5EBE,   
                0xE06F75D8, 0x85C12073, 0x401A449F, 0x56C16AA6,   
                0x4ED3AA62, 0x363F7706, 0x1BFEDF72, 0x429B023D,   
                0x37D0D724, 0xD00A1248, 0xDB0FEAD3, 0x49F1C09B,   
                0x075372C9, 0x80991B7B, 0x25D479D8, 0xF6E8DEF7,   
                0xE3FE501A, 0xB6794C3B, 0x976CE0BD, 0x04C006BA,   
                0xC1A94FB6, 0x409F60C4, 0x5E5C9EC2, 0x196A2463,   
                0x68FB6FAF, 0x3E6C53B5, 0x1339B2EB, 0x3B52EC6F,   
                0x6DFC511F, 0x9B30952C, 0xCC814544, 0xAF5EBD09,   
                0xBEE3D004, 0xDE334AFD, 0x660F2807, 0x192E4BB3,   
                0xC0CBA857, 0x45C8740F, 0xD20B5F39, 0xB9D3FBDB,   
                0x5579C0BD, 0x1A60320A, 0xD6A100C6, 0x402C7279,   
                0x679F25FE, 0xFB1FA3CC, 0x8EA5E9F8, 0xDB3222F8,   
                0x3C7516DF, 0xFD616B15, 0x2F501EC8, 0xAD0552AB,   
                0x323DB5FA, 0xFD238760, 0x53317B48, 0x3E00DF82,   
                0x9E5C57BB, 0xCA6F8CA0, 0x1A87562E, 0xDF1769DB,   
                0xD542A8F6, 0x287EFFC3, 0xAC6732C6, 0x8C4F5573,   
                0x695B27B0, 0xBBCA58C8, 0xE1FFA35D, 0xB8F011A0,   
                0x10FA3D98, 0xFD2183B8, 0x4AFCB56C, 0x2DD1D35B,   原文在:http://fulong258.blog.163.com/blog/static/1789504420100501622313/我在网上找的,但是加密后的结果是字节数组,打印出来是乱码,但是解密后的结果是正确的,我现在想把加密的结果保存到数据库中,但是是乱码,该怎么处理啊

解决方案 »

  1.   

    思路:将结果转换成十六进制就不会乱了
    /**将二进制转换成16进制 
     * @param buf 
     * @return  String
     */  
    public static String parseByte2HexStr(byte buf[]) {  
            StringBuffer sb = new StringBuffer();  
            for (int i = 0; i < buf.length; i++) {  
                    String hex = Integer.toHexString(buf[i] & 0xFF);  
                    if (hex.length() == 1) {  
                            hex = '0' + hex;  
                    }  
                    sb.append(hex.toUpperCase());  
            }  
            return sb.toString();  
    }

    /**将16进制转换为二进制 
     * @param hexStr 
     * @return  byte[]
     */  
    public static byte[] parseHexStr2Byte(String hexStr) {
            if (hexStr.length() < 1)  
                    return null;  
            byte[] result = new byte[hexStr.length()/2];  
            for (int i = 0;i< hexStr.length()/2; i++) {  
                    int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);  
                    int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);  
                    result[i] = (byte) (high * 16 + low);  
            }  
            return result;  
    }  将以上两个方法放进去,然后再对加密解密的入口函数进行改造    public String encrypttoStr( final String input ){
        
         return parseByte2HexStr(encrypt(input));  
        }    public String decryptString( final String source )   
        {        
             return  decryptString(parseHexStr2Byte(source));   
             
        }
    再将以上两个入口方法放进去,加密方法调用encrypttoStr就可以,解密不用改直接重载了测试:
        public static void main(String args[]) throws Exception {     //KEY
         String key="HongLonglong";
         byte [] keyByte = key.getBytes();
         //要加密的字符串
         String str = "http://www.honglonglong.com";
         
         ///////////////////
         
         //加密
         Blowfish bf3 = new Blowfish();
         bf3.init(true,keyByte);
         
         //加密后的数组
         String ttt =bf3.encrypttoStr(str);
         System.out.println("加密后的结果:"+ttt);
         
         //解密
         Blowfish bf4 = new Blowfish();
         bf4.init(true,keyByte);
         System.out.println(bf4.decryptString(ttt));
        }运行结果:
    加密后的结果:011B000AFC43590E9F8D7076DD672F4E6DA897C68F5180A7892C6EC0088BB13D10F60A
    http://www.honglonglong.com
      

  2.   

    你可以把字节数组中的值用StringBuffer做toString,然后保存在db中,但是貌似很笨!
    不太懂,帮你顶咯