簡體   English   中英

JAVA(AES / CBC / PKCS5PADDING)什么是對應的C / C ++

[英]JAVA (AES/CBC/PKCS5PADDING) What is the corresponding C/C++

使用Sun JCE提供程序的Cipher.getInstance(“ AES / CBC / PKCS5PADDING”)i:

public static void main(String[] args) throws UnsupportedEncodingException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, ShortBufferException, IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException
{
    System.out.println("=======================AES/CBC/PKCS5Padding=====================");
    // key
    byte[] key = "0123456789abcdef".getBytes("UTF-8");
    dump("key", key);
    // iv
    byte[] iv = "fedcba9876543210".getBytes("UTF-8");
    dump("iv", iv);

    byte[] indata = "bsmith is a good guy.".getBytes("UTF-8");
    dump("indata", indata);

    AES aes = new AES();
    aes.init(key, iv);
    byte[] outdata = aes.encrypt(indata);
    dump("outdata", outdata);

    byte[] indata1 = aes.decrypt(outdata);
    dump("indata1", indata1);
}

private Cipher enc;
private Cipher dec;
private SecretKeySpec keySpec;
private IvParameterSpec ivSpec;

public AES()
{
}

/**
 * init the AES key.
 * the key must be 128, 192, or 256 bits.
 * @param key the AES key.
 * @param keyoff the AES key offset.
 * @param keylen the AES key length, the key length must be 16 bytes because SunJCE only support 16 bytes key.
 * @param iv the IV for CBC, the length of iv must be 16 bytes.
 * @param ivoff the iv offset.
 */
public void init(byte[] key, int keyoff, int keylen, byte[] iv, int ivoff)
{
    keySpec = new SecretKeySpec(key, keyoff, keylen, "AES");
    ivSpec = new IvParameterSpec(iv, ivoff, 16);
}

/**
 * init the AES key.
 * the key must be 16 bytes, because SunJCE only support 16 bytes key..
 * @param key the AES key.
 * @param iv the iv for CBC, iv must be 16 bytes length.
 */
public void init(byte[] key, byte[] iv)
{
    keySpec = new SecretKeySpec(key, "AES");
    ivSpec = new IvParameterSpec(iv);
}

/**
* get the maximal cipher data length after encrypted.
* @param len the plain data length.
* @return the cipher data length.
*/
public int getCipherLen(int len)
{
    // for PKCS#1 v1.5 padding
    // max padding BLOCK_SIZE=16.
    int pad = len%16;
    if (0 == pad)
    {
        return len + 16;
    }
    return len - pad + 16;
}

/**
 * encrypt the input data to output data.
 * the input data length must be the times of 16 bytes.
 * and the output data length is equals to the input data.
 * @param indata the input data.
 * @param inoff the input data offset.
 * @param inlen the input data length.
 * @param outdata the output data.
 * @param outoff the output data offset.
 */
public void encrypt(byte[] indata, int inoff, int inlen, byte[] outdata, int outoff) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, ShortBufferException, IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException
{
    initEncryptor();
    enc.doFinal(indata, inoff, inlen, outdata, outoff);
}

/**
 * encrypt the input data to output data.
 * @param indata the input data.
 * @param inoff the input data offset.
 * @param inlen the input data length.
 * @return the output encrypted data.
 */
public byte[] encrypt(byte[] indata, int inoff, int inlen) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, ShortBufferException, IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException
{
    initEncryptor();
    return enc.doFinal(indata, inoff, inlen);
}

/**
 * encrypt the input data to output data.
 * @param indata the input data.
 * @return the output data.
 * @throws NoSuchAlgorithmException
 * @throws NoSuchPaddingException
 * @throws InvalidKeyException
 * @throws InvalidAlgorithmParameterException
 * @throws IllegalBlockSizeException
 * @throws BadPaddingException
 */
public byte[] encrypt(byte[] indata) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException
{
    initEncryptor();
    return enc.doFinal(indata);
}

/**
* the maximal plain data length after decrypted.
* @param len the cipher data length that will be decrypted.
* @return the maximal plain data length.
*/
public int getPlainLen(int len)
{
    // for PKCS#1 v1.5 padding
    // len always be times of BLOCK_SIZE=16.
    return len;
}

/**
 * decrypt the input data to output data.
 * @param indata the input data.
 * @param inoff the input data offset.
 * @param inlen the input data length.
 * @param outdata the output data.
 * @param outoff the output data offset.
 */
public void decrypt(byte[] indata, int inoff, int inlen, byte[] outdata, int outoff) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, ShortBufferException, IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException
{
    initDecryptor();
    dec.doFinal(indata, inoff, inlen, outdata, outoff);
}

/**
 * decrypt the input data to output data.
 * @param indata the input data.
 * @param inoff the input data offset.
 * @param inlen the input data length.
 * @return the output decrypted data.
 */
public byte[] decrypt(byte[] indata, int inoff, int inlen) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, ShortBufferException, InvalidAlgorithmParameterException
{
    initDecryptor();
    return dec.doFinal(indata, inoff, inlen);
}

/**
 * decrypt the input data to output data.
 * @param indata the input cipher data.
 * @return the output plain data.
 * @throws NoSuchAlgorithmException
 * @throws NoSuchPaddingException
 * @throws InvalidKeyException
 * @throws InvalidAlgorithmParameterException
 * @throws IllegalBlockSizeException
 * @throws BadPaddingException
 */
public byte[] decrypt(byte[] indata) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException
{
    initDecryptor();
    return dec.doFinal(indata);
}

private void initEncryptor() throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException
{
    if (null == enc)
    {
        enc = Cipher.getInstance("AES/CBC/PKCS5Padding");
        enc.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
    }
}

private void initDecryptor() throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException
{
    if (null == dec)
    {
        dec = Cipher.getInstance("AES/CBC/PKCS5Padding");
        dec.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
    }
}

}

對應什么是C / C ++? 我發現crypto ++正確,其他不是,但是里面的算法太多了,我只需要AES。那太復雜了,我不會,我是新手,您熟悉此算法,我想移植它打包成Android。

首先,PKCS#5填充更好地稱為PKCS#7填充。 PKCS#5填充實際上是針對8個字節的塊密碼,而PKCS#7填充實際上是針對16個字節的塊密碼。 否則它們是相同的。

如果密碼庫提供AES和CBC,則可以。 這或多或少是給定的,因為CBC是較常見的模式之一。 正確的填充模式的可用性可能有所不同,盡管大多數C ++庫將支持PKCS#5填充,因為它是事實上的標准。

由於存在可用的(NIST)測試向量,並且由於字節順序已知,因此任何支持算法,模式和填充模式組合的庫都應可互操作。

暫無
暫無

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

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