中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android加密AES CR4使用

發布時間:2020-05-26 20:05:10 來源:網絡 閱讀:1622 作者:kz1080 欄目:移動開發

AES有五種加密模式分別是CBC、ECB、CTR、OCF、CFB;

 1.如果不選擇填充會默認采用 ECB 模式和 PKCS5Padding 填充進行處理

 AES 是塊加密,塊的長度是16個字節,如果原文不到16個字節,則需要填充至16個字節后再進行處理。
   AES密文長度=(原文長度/16)*16+16;最終長度為N+1;所以一定要選擇NoPadding模式。

 2. 隨機數生成器

 在Android加密算法中需要隨機數時要使用SecureRandom來獲取隨機數。

 注意不要給SecureRandom設置種子。調用seeded constructor或者setSeed(byte[])是不安全的。  SecureRandom()默認使用的是dev/urandom作為種子產生器,這個種子是不可預測的。

  開發者建議:

  1、不要使用Random類來獲取隨機數。

  2、在使用SecureRandom時候,不要設置種子

SecureRandom secureRandom = new SecureRandom();
byte[] key = new byte[16];  //隨機秘鑰
secureRandom.nextBytes(key)

/**
 * 生成隨機key
 *
 * @return key
 * @throws Exception generate error
 */
public static byte[] getRawKey() throws Exception {
    KeyGenerator kgen = KeyGenerator.getInstance("AES");
    SecureRandom sr = null;
    if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.JELLY_BEAN) {
        sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");
    } else {
        sr = SecureRandom.getInstance("SHA1PRNG");
    }
    kgen.init(128, sr); // 192 and 256 bits may not be available
    SecretKey skey = kgen.generateKey();
    byte[] raw = skey.getEncoded();
    return raw;
}

/**
 * AES 加密原文16字節對齊,不足補零
 *
 * @param raw    加密秘鑰
 * @param source 被加密數據
 * @return 密文
 * @throws Exception
 */
public static byte[] encrypt(byte[] raw, byte[] source) throws Exception {
    byte[] original;
    if (raw.length != 16)
        throw new IllegalArgumentException("key is not 16 bytes");
    if (source.length % 16 != 0) {
        original = new byte[(source.length / 16 + source.length % 16 == 0 ? 0 : 1) * 16];
        System.arraycopy(source, 0, original, 0, source.length);
    } else {
        original = Arrays.copyOf(source, source.length);
    }
    SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
    Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
    byte[] encrypted = cipher.doFinal(original);
    return encrypted;
}

/**
 * AES機密密文,AES/ECB/NoPadding參數要和加密時一樣,NoPadding原文密文長度一致。
 *
 * @param raw       秘鑰
 * @param encrypted 密文
 * @return 原文
 * @throws Exception
 */
public static byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception {
    if (encrypted.length % 16 != 0)
        return encrypted;
    SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
    Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
    cipher.init(Cipher.DECRYPT_MODE, skeySpec);
    byte[] decrypted = cipher.doFinal(encrypted);
    return decrypted;
}

/**
 * RC4 加密原文16字節對齊,不足補零
 *
 * @param raw    秘鑰
 * @param source 原文
 * @return 密文
 * @throws Exception
 */
public static byte[] rc4(byte[] raw, byte[] source) throws Exception {
    byte[] original;
    if (raw.length != 16)
        throw new IllegalArgumentException("key is not 16 bytes");
    if (source.length % 16 != 0) {
        original = new byte[(source.length / 16 + source.length % 16 == 0 ? 0 : 1) * 16];
        System.arraycopy(source, 0, original, 0, source.length);
    } else {
        original = Arrays.copyOf(source, source.length);
    }
    SecretKeySpec skeySpec = new SecretKeySpec(raw, "RC4");
    Cipher cipher = Cipher.getInstance("RC4");
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
    byte[] encrypted = cipher.doFinal(original);
    return encrypted;
}

/**
 * 從大到小排序
 *
 * @param source
 */
public static void sortByDescending(int source[]) {
    int swap = 0;
    for (int position = 0; position < source.length; position++) {
        for (int location = 0; location < source.length; location++) {
            if (source[position] > source[location]) {
                swap = source[position];
                source[position] = source[location];
                source[location] = swap;
            }
        }
    }
}


/**
 * 生成隨機的length長的String。
 *
 * @param length 生成的字符長度。
 * @return 生成的隨機字符。
 */
public static String getRandomString(int length) {
    String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    Random random = new Random();
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < length; i++) {
        int number = random.nextInt(62);
        sb.append(str.charAt(number));
    }
    return sb.toString();
}

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

滦平县| 肃北| 政和县| 佛坪县| 昭通市| 北海市| 广州市| 铁岭市| 尖扎县| 拜泉县| 米林县| 盱眙县| 砀山县| 贡嘎县| 怀安县| 绥化市| 临桂县| 改则县| 石林| 化隆| 抚顺县| 龙岩市| 闽清县| 仙居县| 东兴市| 太康县| 惠东县| 汉川市| 泌阳县| 东丰县| 邯郸县| 松桃| 南宁市| 金乡县| 佛山市| 西平县| 芮城县| 宜兰县| 九江县| 连山| 邳州市|