2016-08-04 11 views
-3

AESを使用して17桁の番号(たとえば123456789)を暗号化した後、byte[]をBase64でエンコードします。最終的な結果の文字列の長さは24です。私はそれをバーコードしたい、24文字が長すぎます。 15文字で構成された1つの文字列は良好で、約15桁(たとえば123456789)が良いでしょう。は17桁でAESなどのアルゴリズムで15桁の数字に暗号化することができます

アルゴリズム(AES、DES、3DES ..)で私の目標を達成する方法はありますか?そしてどうやって?

マイDESの暗号化アルゴリズム、

 public static byte[] encrypt(byte[] datasource, String password) {    
      try{ 
        SecureRandom random = new SecureRandom(); 
        DESKeySpec desKey = new DESKeySpec(password.getBytes()); 
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); 
        SecretKey securekey = keyFactory.generateSecret(desKey); 
        Cipher cipher = Cipher.getInstance("DES"); 
        cipher.init(Cipher.ENCRYPT_MODE, securekey, random); 
        return cipher.doFinal(datasource); 
      }catch(Throwable e){ 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     private static void longToByteArray(long l, byte[] b) { 
      b[7] = (byte) (l); 
      l >>>= 8; 
      b[6] = (byte) (l); 
      l >>>= 8; 
      b[5] = (byte) (l); 
      l >>>= 8; 
      b[4] = (byte) (l); 
      l >>>= 8; 
      b[3] = (byte) (l); 
      l >>>= 8; 
      b[2] = (byte) (l); 
      l >>>= 8; 
      b[1] = (byte) (l); 
      l >>>= 8; 
      b[0] = (byte) (l); 
     } 



     long aliveTime = Long.parseLong("13664547854160806"); 
     byte[] longAsBytes = new byte[8]; 
     longToByteArray(aliveTime, longAsBytes); 
     byte[] result = DES.encrypt(longAsBytes, password); 
     String en = REncrypt.base64Encode(result); 
+1

「17デジタル」とは何ですか?どの暗号化アルゴリズムが適切なのかあなたは、あなたを助けるのに十分な情報を与えていません! –

+0

@MarcusMüller私は私の質問を修正します、この時間を私はそれをもう少し明確に言うことを願っています – Ron

+0

あなたの質問は理にかなっていません。パイントポットからクォートを得ることはできませんし、パイントポットにクォートを入れることもできません。暗号化も他の技術もここでは動作しません。 * input *のサイズを減らさなければならない、あるいは15桁までハッシュした場合に起こりうる衝突を許容する必要があります。 – EJP

答えて

1

は、暗号化アルゴリズムは、データを圧縮しません。実際、何かがあれば、暗号化されたデータは元のデータよりも圧縮するのが難しくなります。暗号化アルゴリズムが実行する「スクランブリング」は、暗号化されたデータの冗長性を(おそらく不可能なほど)抽出するようにします。

を圧縮してからに暗号化するとよいでしょう。この場合、小数点文字を2進数に変換すると、おそらくテキスト圧縮アルゴリズムよりも優れた圧縮率が得られます。 17桁の数字は8バイトに収まります。すなわちJava longである。

だからここは私がどうなるのかです:

  1. longに小数点以下の桁数を変換します。すなわちそれをLong.parseLongまたは類似のものを使用して解析する。
  2. longを8バイトに分割し、byte[]に入れます。
  3. byte[]を暗号化します。結果は8バイトでなければなりません。
  4. Base64はバイトをエンコードします。

このようにすると、暗号化されたbase64エンコード番号は15文字未満にする必要があります。

注:私はあなたが実際に暗号化を意味していると仮定しています。つまり、元の番号を復号化して復元できる必要があるということです。

UPDATE

彼らは一般的に大きすぎる最小ブロックサイズを持っているので、これはおそらく、多くの/ほとんどのまともな暗号化アルゴリズムでは動作しません。 https://en.wikipedia.org/wiki/Block_size_(cryptography)を参照してください。記事を読んだら、それがなぜそうであるかについてのいくつかの洞察を得るでしょう。

実際にここで達成しようとしていることを確認し、暗号化がそれを達成する最も良い方法であるかどうかを判断する必要があります。

+0

3番目のステップの結果は16バイトです。私のコードで何が問題になっていますか? – Ron

+1

ああ...ブロックサイズが16バイトの「ブロック」ベースの暗号化方式を使用している必要があります。これを読んでください:要求レビューの要求のために、https://en.wikipedia.org/wiki/Block_size_(cryptography) –

+0

+1。 @Ron:あなたの目標/要件を明確にしてください。 – greybeard

関連する問題