java加密,密文长度可以小于等于明文长度吗?

目前遇到一个问题,需要把数据库中所有涉及到身份证号的表的字段从明文变成密文,但是表设计的时候身份证号码字段长度只有18位,有没有办法可以在不改变表接口(需要改动的表太多了)然后储存密文,并且密文是可以反解的

分享一段之前写的简单编码和解码代码,给你点提示,首先可以肯定的是你的需求可以做到!
若需要解码代码,请跟我留言。

 /**
       * 简单的字符穿编码
       **/
      public static String encode(String ss,String enc)
      {
        StringBuffer sb=new StringBuffer("");
        int x=0;
        for (int i=0;i<ss.length();i++)
        {
          int z=ss.charAt(i)^enc.charAt(x);
          x++;
          if (x>=enc.length()) x=0;
          if (i>0) sb.append('|');
          sb.append(Long.toHexString(z));
        }
        return sb.toString();
      }

你做身份证插入的时候就应该加密了,你的数据库的字段长度不限制都行,在插入身份证的时候判断是不是15位或者18位,然后进行加密操作,插入数据库,读取的时候自然要用到解密。

没有,变短了的,一般不能支持反解了。

可以,比较是用加密后的比,解密一般会有些问题

可以的 你可以这样 把身份证长度 两位两位分成一组 然后转成16进制 或者更高的进制

可以的,只不过解密的时候会出现问题

可以的,只要把加解密的规则定义清楚就行,最简单的比如大写变小写之类 肯定长度不变,当然可以定义比较复杂的规则

你可以把省份正分2组,1-17位是数字(为一组),最后一位可能是数字或者X(为一组),然后把第一组转成16进制,你只需要加密第一组就可以了。
比如身份证44088219940705278X
44088219940705278 转成16进制 9ca200a0585400 假如加密(加密算法可以自己定义)后 ,变成 09fgfse438sjc
最后保存到数据库中 是 09fgfse438sjcX

然后你返回到客户端的时候,再逆向操作就行。

简单的加密就可以了。0对应A 1对应B 依次类推。X不变不就可以了,

过了好久才发现有这么多回答了,可惜当时都没注意。
后来的解决方案是使用aop在service层insert和update时候去除idno字段的值进行加密(加密方法任意选),然后将加密结果存到新建表中,字段多长都行。原先身份证字段改成加密表的外键。select的时候查到新建表的加密值进行解密。