簡體   English   中英

AES ECB模式在Java中加密並在ruby中解密

[英]AES ECB mode encrypt in java and decrypt in ruby

我必須使用Java編寫的加密方法。 我的加密Java代碼:

public static String encrypt(String content, String sKey) {
  try {
    SecretKey secretKey = null;
    KeyGenerator kgen = KeyGenerator.getInstance("AES");
    SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
    secureRandom.setSeed(sKey.getBytes());
    kgen.init(128, secureRandom);
    secretKey = kgen.generateKey();
    byte[] enCodeFormat = secretKey.getEncoded();
    SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");

    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.ENCRYPT_MODE, key);

    byte[] byteContent = content.getBytes("utf-8");
    byte[] result = cipher.doFinal(byteContent);

    return ByteUtil.parseByte2HexStr(result);
  } catch (Exception e) {
    e.printStackTrace();
  }
  return content;
}


## ByteUtil.java
...
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();
}

我的紅寶石解密代碼(不起作用):

require "openssl"
require 'digest/sha2'
require 'base64'

def decryption(encrypted, key)
  decipher = OpenSSL::Cipher::AES.new(128, :ECB)
  decipher.decrypt
  decipher.padding = 0
  decipher.key = [key].pack('H*')

  encrypted = [encrypted].pack('H*')
  plain = decipher.update(encrypted) + decipher.final

  p plain
  p plain.unpack('s*')
  p plain.unpack('m*')
  p plain.unpack('u*')
  p plain.unpack('h*')
  p plain.unpack('a*')
end

有人可以幫忙嗎? 提前致謝!!!

當我使用“ ef3192c8803a47cb829d487dd2f78a3d”作為密鑰,並用我的java代碼加密“ helloworld”時,我得到了“ 3CAEF382FB17A045EADDEFC72D3D0362”,但是當我嘗試使用紅寶石代碼對其進行解密時,我打電話

decryption('3CAEF382FB17A045EADDEFC72D3D0362', 'ef3192c8803a47cb829d487dd2f78a3d')

我不能讓“的HelloWorld”,所以我認為解密代碼是不工作的。

Java解密代碼(有效)

public static String decrypt(String content, String sKey) {
    try {
        SecretKey secretKey = null;
        KeyGenerator kgen = KeyGenerator.getInstance("AES");
        SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
        secureRandom.setSeed(sKey.getBytes());
        kgen.init(128, secureRandom);
        secretKey = kgen.generateKey();

        byte[] data = ByteUtil.parseHexStr2Byte(content);
        byte[] enCodeFormat = secretKey.getEncoded();

        SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, key);
        byte[] result = cipher.doFinal(data);
        return new String(result, "UTF-8");
    } catch (Exception e) {
        e.printStackTrace();
    }
    return content;
}

Java實現有些混亂。

在Java代碼用於加密實際的AES密鑰SecretKey secretKey與使用下面的代碼生成的String sKey作為輸入:

    SecretKey secretKey = null;
    KeyGenerator kgen = KeyGenerator.getInstance("AES");
    SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
    secureRandom.setSeed(sKey.getBytes());
    kgen.init(128, secureRandom);
    secretKey = kgen.generateKey();
    byte[] enCodeFormat = secretKey.getEncoded();

為了能夠在紅寶石代碼中解密,您需要SecretKey secretKey的內容。 嘗試在上面的代碼之后添加以下trace語句:

    System.out.println("Key: " + ByteUtil.parseByte2HexStr(enCodeFormat));

並將其用作紅寶石通話中的密鑰。

您沒有在兩端使用相同的密鑰。 在Java加密,您使用的密鑰作為種子的隨機數生成器,然后使用輸出作為重點。 在Ruby方面,您直接將輸入值用作鍵。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM