国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【ios】【android】3DES_CBC_PKCS5Padding加密、解密問題(附完整代碼)

這篇具有很好參考價值的文章主要介紹了【ios】【android】3DES_CBC_PKCS5Padding加密、解密問題(附完整代碼)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

問題一:加密結(jié)果不一致

一、問題描述

實現(xiàn)了android的藍(lán)牙對接后開始著手ios的藍(lán)牙對接,出現(xiàn)了ios加密結(jié)果與在線加密的結(jié)果一致,而android的加密結(jié)果與甲方公司的結(jié)果一致的問題。

1.android部分代碼如下:
	public byte[] get3DesEncCodeCBC(byte[] byteS, byte[] key, byte[] iv) {
        byte[] byteFina = null;
        Cipher cipher;
        try {
            SecretKey desKey = new SecretKeySpec(key, "DESede");
            IvParameterSpec desIV = new IvParameterSpec(iv);
            cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
            cipher.init(cipher.ENCRYPT_MODE, desKey, desIV);
            byteFina = cipher.doFinal(byteS);
        } catch (Exception error) {
            error.printStackTrace();
        } finally {
            cipher = null;
        }
        return byteFina;
    }
2.ios部分代碼如下:
	public static func CBCMain(op: Int, key: String, iv: String, content: String) -> String? {
        // op傳1位加密,0為解密
        // CCOperation(kCCEncrypt)加密 1
        // CCOperation(kCCDecrypt) 解密 0
        var ccop = CCOperation();
        // Key
        let keyData: NSData = (key as NSString).data(using: String.Encoding.utf8.rawValue)! as NSData;
        let keyBytes = UnsafeRawPointer(keyData.bytes);
        let keyLength = size_t(kCCKeySize3DES);
        // 可選的初始化向量
        let ivData: NSData = (iv as NSString).data(using: String.Encoding.utf8.rawValue)! as NSData;
        let ivDataBytes = UnsafeRawPointer(ivData.bytes);
        // 加密或解密的內(nèi)容
        if op == 1 {
            ccop = CCOperation(kCCEncrypt);
        } else {
            ccop = CCOperation(kCCDecrypt);
        }
        let data: NSData = (content as NSString).data(using: String.Encoding.utf8.rawValue)! as NSData;
        let dataLength = size_t(data.length);
        let dataBytes = UnsafeRawPointer(data.bytes);
        // 返回數(shù)據(jù)
        let cryptData = NSMutableData(length: Int(dataLength) + kCCBlockSize3DES);
        let cryptPointer = UnsafeMutableRawPointer(cryptData!.mutableBytes);
        let cryptLength = size_t(cryptData!.length);
        // 特定的幾個參數(shù)
        let operation: CCOperation = UInt32(ccop);
        let algoritm: CCAlgorithm = UInt32(kCCAlgorithm3DES);
        let options: CCOptions = UInt32(kCCOptionPKCS7Padding);
        var numBytesCrypted :size_t = 0;
        let cryptStatus = CCCrypt(operation, // 加密還是解密
                                  algoritm, // 算法類型
                                  options,  // 密碼塊的設(shè)置選項
                                  keyBytes, // 秘鑰的字節(jié)
                                  keyLength, // 秘鑰的長度
                                  ivDataBytes, // 可選初始化向量的字節(jié)
                                  dataBytes, // 加解密內(nèi)容的字節(jié)
                                  dataLength, // 加解密內(nèi)容的長度
                                  cryptPointer, // output data buffer
                                  cryptLength,  // output data length available
                                  &numBytesCrypted); // real output data length
        if UInt32(cryptStatus) == UInt32(kCCSuccess) {
            cryptData!.length = Int(numBytesCrypted);
            if op == 1  {
                // 返回加密的數(shù)據(jù)
                let hexStr = DataUtils.nsDataToHex(data: cryptData!);
                return hexStr;
            } else {
                // 返回解密的數(shù)據(jù)
                let hexStr = DataUtils.nsDataToHex(data: cryptData!);
                return hexStr;
            }
        }
        return nil;
    }
二、問題解決

重新看了一遍android加密調(diào)用部分的代碼,使用了十六進(jìn)制字符串轉(zhuǎn)byte數(shù)組的方法:
【ios】【android】3DES_CBC_PKCS5Padding加密、解密問題(附完整代碼)
由于是對藍(lán)牙數(shù)據(jù)進(jìn)行加密,所以傳入的字符串為十六進(jìn)制,在ios代碼中使用:

(content as NSString).data(using: String.Encoding.utf8.rawValue)! as NSData;

是錯誤的,改為十六進(jìn)制字符串的轉(zhuǎn)換方法:

let keyData: NSData = Data.init(hex: key) as NSData;

最終獲取到了正確的加密結(jié)果。

問題二:解密結(jié)果不一致

一、問題描述

在解決完加密結(jié)果不一致的問題后,發(fā)現(xiàn)ios的解密結(jié)果也與android結(jié)果不一致。

二、問題解決

在著手解決加密結(jié)果不一致的問題時,有篇文章中寫到android對key的處理,若key為16字節(jié),則會將前8字節(jié)拼接到key末尾,組成24字節(jié)的key,而ios存在16字節(jié)與24字節(jié)兩種長度的key值,若傳入的key為16字節(jié),則會直接使用16字節(jié)的key。所以在key傳入時,對其做長度的判斷,若為16字節(jié)則進(jìn)行拼接即可解決。文章來源地址http://www.zghlxwxcb.cn/news/detail-417236.html

ios部分代碼如下:
	public static func decryptionCBC(key: String, iv: String, content: String) -> String? {
        // 密鑰處理
        var keyStr = [String]();
        if key.length() == 32 {
            keyStr.append(key);
            keyStr.append(key.substr(index: 0, length: 16));
        }
        let keyData: NSData = Data.init(hex: keyStr.joined()) as NSData;
        let keyBytes = UnsafeRawPointer(keyData.bytes);
        let keyLength = size_t(kCCKeySize3DES);
        // 可選的初始化向量
        let ivData: NSData = Data.init(hex: iv) as NSData;
        let ivDataBytes = UnsafeRawPointer(ivData.bytes);
        // 加密或解密的內(nèi)容
        let ccop = CCOperation(kCCDecrypt);
        let data = Data.init(hex: content) as NSData;
        let dataLength = size_t(data.length);
        let dataBytes = UnsafeRawPointer(data.bytes);
        // 返回數(shù)據(jù)
        let cryptData = NSMutableData(length: Int(dataLength) + kCCBlockSize3DES);
        let cryptPointer = UnsafeMutableRawPointer(cryptData!.mutableBytes);
        let cryptLength = size_t(cryptData!.length);
        // 特定的幾個參數(shù)
        let operation: CCOperation = UInt32(ccop);
        let algoritm: CCAlgorithm = UInt32(kCCAlgorithm3DES);
        let options: CCOptions = UInt32(kCCOptionPKCS7Padding);
        var numBytesCrypted :size_t = 0;
        let cryptStatus = CCCrypt(operation, // 加密還是解密
                                  algoritm, // 算法類型
                                  options,  // 密碼塊的設(shè)置選項
                                  keyBytes, // 秘鑰的字節(jié)
                                  keyLength, // 秘鑰的長度
                                  ivDataBytes, // 可選初始化向量的字節(jié)
                                  dataBytes, // 加解密內(nèi)容的字節(jié)
                                  dataLength, // 加解密內(nèi)容的長度
                                  cryptPointer, // output data buffer
                                  cryptLength,  // output data length available
                                  &numBytesCrypted); // real output data length
        if UInt32(cryptStatus) == UInt32(kCCSuccess) {
            cryptData!.length = Int(numBytesCrypted);
            let hexStr = DataUtils.nsDataToHex(data: cryptData!);
            return hexStr;
        }
        return nil;
    }

附一:測試通過后的IOS SWIFT 3DES加密解密代碼

	/**
     - CBC算法加密
     - parameter key: 密鑰
     - parameter iv: 偏移量
     - parameter content: 加密數(shù)據(jù)
     - returns: string
     */
    public static func encryptionCBC(key: String, iv: String, content: String) -> String? {
        // 密鑰處理
        var keyStr = [String]();
        if key.length() == 32 {
            keyStr.append(key);
            keyStr.append(key.substr(index: 0, length: 16));
        }
        let keyData: NSData = Data.init(hex: keyStr.joined()) as NSData;
        let keyBytes = UnsafeRawPointer(keyData.bytes);
        let keyLength = size_t(kCCKeySize3DES);
        // 可選的初始化向量
        let ivData: NSData = Data.init(hex: iv) as NSData;
        let ivDataBytes = UnsafeRawPointer(ivData.bytes);
        // 加密或解密的內(nèi)容
        let ccop = CCOperation(kCCEncrypt);
        let data = Data.init(hex: content) as NSData;
        let dataLength = size_t(data.length);
        let dataBytes = UnsafeRawPointer(data.bytes);
        // 返回數(shù)據(jù)
        let cryptData = NSMutableData(length: Int(dataLength) + kCCBlockSize3DES);
        let cryptPointer = UnsafeMutableRawPointer(cryptData!.mutableBytes);
        let cryptLength = size_t(cryptData!.length);
        // 特定的幾個參數(shù)
        let operation: CCOperation = UInt32(ccop);
        let algoritm: CCAlgorithm = UInt32(kCCAlgorithm3DES);
        let options: CCOptions = UInt32(kCCOptionPKCS7Padding);
        var numBytesCrypted :size_t = 0;
        let cryptStatus = CCCrypt(operation, // 加密還是解密
                                  algoritm, // 算法類型
                                  options,  // 密碼塊的設(shè)置選項
                                  keyBytes, // 秘鑰的字節(jié)
                                  keyLength, // 秘鑰的長度
                                  ivDataBytes, // 可選初始化向量的字節(jié)
                                  dataBytes, // 加解密內(nèi)容的字節(jié)
                                  dataLength, // 加解密內(nèi)容的長度
                                  cryptPointer, // output data buffer
                                  cryptLength,  // output data length available
                                  &numBytesCrypted); // real output data length
        if UInt32(cryptStatus) == UInt32(kCCSuccess) {
            cryptData!.length = Int(numBytesCrypted);
            let hexStr = DataUtils.nsDataToHex(data: cryptData!);
            return hexStr;
        }
        return nil;
    }

	/**
     - CBC算法解密
     - parameter key: 密鑰
     - parameter iv: 偏移量
     - parameter content: 加密數(shù)據(jù)
     - returns: string
     */
    public static func decryptionCBC(key: String, iv: String, content: String) -> String? {
        // 密鑰處理
        var keyStr = [String]();
        if key.length() == 32 {
            keyStr.append(key);
            keyStr.append(key.substr(index: 0, length: 16));
        }
        let keyData: NSData = Data.init(hex: keyStr.joined()) as NSData;
        let keyBytes = UnsafeRawPointer(keyData.bytes);
        let keyLength = size_t(kCCKeySize3DES);
        // 可選的初始化向量
        let ivData: NSData = Data.init(hex: iv) as NSData;
        let ivDataBytes = UnsafeRawPointer(ivData.bytes);
        // 加密或解密的內(nèi)容
        let ccop = CCOperation(kCCDecrypt);
        let data = Data.init(hex: content) as NSData;
        let dataLength = size_t(data.length);
        let dataBytes = UnsafeRawPointer(data.bytes);
        // 返回數(shù)據(jù)
        let cryptData = NSMutableData(length: Int(dataLength) + kCCBlockSize3DES);
        let cryptPointer = UnsafeMutableRawPointer(cryptData!.mutableBytes);
        let cryptLength = size_t(cryptData!.length);
        // 特定的幾個參數(shù)
        let operation: CCOperation = UInt32(ccop);
        let algoritm: CCAlgorithm = UInt32(kCCAlgorithm3DES);
        let options: CCOptions = UInt32(kCCOptionPKCS7Padding);
        var numBytesCrypted :size_t = 0;
        let cryptStatus = CCCrypt(operation, // 加密還是解密
                                  algoritm, // 算法類型
                                  options,  // 密碼塊的設(shè)置選項
                                  keyBytes, // 秘鑰的字節(jié)
                                  keyLength, // 秘鑰的長度
                                  ivDataBytes, // 可選初始化向量的字節(jié)
                                  dataBytes, // 加解密內(nèi)容的字節(jié)
                                  dataLength, // 加解密內(nèi)容的長度
                                  cryptPointer, // output data buffer
                                  cryptLength,  // output data length available
                                  &numBytesCrypted); // real output data length
        if UInt32(cryptStatus) == UInt32(kCCSuccess) {
            cryptData!.length = Int(numBytesCrypted);
            let hexStr = DataUtils.nsDataToHex(data: cryptData!);
            return hexStr;
        }
        return nil;
    }

附二:測試通過后的ANDROID 3DES加密解密代碼

一、Des3Utils.java
	/**
     * CBC算法加密
     *
     * @param key
     * @param content
     * @return
     */
    public static String encryptionCBC(String key, String iv, String content) {
        Des3EncryptUtils des = new Des3EncryptUtils();
        byte[] bye = des.get3DesEncCodeCBC(DataUtils.hexStrToByteArray(content), DataUtils.hexStrToByteArray(key), DataUtils.hexStrToByteArray(iv));
        return HexUtils.toString(bye).trim();
    }

	/**
     * CBC算法解密
     *
     * @param key
     * @param content
     * @return
     */
    public static byte[] decryptionCBC(String key, String iv, String content) {
        Des3EncryptUtils des = new Des3EncryptUtils();
        return des.get3DesDesCodeCBC(DataUtils.hexStrToByteArray(content), DataUtils.hexStrToByteArray(key), DataUtils.hexStrToByteArray(iv));
    }
二、DataUtils.java
	/**
     * 16進(jìn)制字符串轉(zhuǎn)byte數(shù)組
     *
     * @param hexStr
     * @return
     */
    public static byte[] hexStrToByteArray(String hexStr) {
        if (hexStr == null) {
            return null;
        }
        if (hexStr.length() == 0) {
            return new byte[0];
        }
        byte[] byteArray = new byte[hexStr.length() / 2];
        for (int i = 0; i < byteArray.length; i++) {
            String subStr = hexStr.substring(2 * i, 2 * i + 2);
            byteArray[i] = ((byte) Integer.parseInt(subStr, 16));
        }
        return byteArray;
    }
三、Des3EncryptUtils.java
    /**
     * CBC算法加密(帶向量)
     *
     * @param byteS
     * @return
     */
    public byte[] get3DesEncCodeCBC(byte[] byteS, byte[] key, byte[] iv) {
        byte[] byteFina = null;
        Cipher cipher;
        try {
            SecretKey desKey = new SecretKeySpec(key, "DESede");
            IvParameterSpec desIV = new IvParameterSpec(iv);
            cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
            cipher.init(cipher.ENCRYPT_MODE, desKey, desIV);
            byteFina = cipher.doFinal(byteS);
        } catch (Exception error) {
            error.printStackTrace();
        } finally {
            cipher = null;
        }
        return byteFina;
    }

    /**
     * CBC算法解密(帶向量)
     *
     * @param byteS
     * @return
     */
    public byte[] get3DesDesCodeCBC(byte[] byteS, byte[] key, byte[] iv) {
        byte[] byteFina = null;
        Cipher cipher;
        try {
            SecretKey desKey = new SecretKeySpec(key, "DESede");
            IvParameterSpec desIV = new IvParameterSpec(iv);
            cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
            cipher.init(cipher.DECRYPT_MODE, desKey, desIV);
            byteFina = cipher.doFinal(byteS);
        } catch (Exception error) {
            error.printStackTrace();
        } finally {
            cipher = null;
        }
        return byteFina;
    }

到了這里,關(guān)于【ios】【android】3DES_CBC_PKCS5Padding加密、解密問題(附完整代碼)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • ssh命令報錯no matching cipher found. Their offer: aes128-cbc,aes192-cbc,aes256-cbc,3des-cbc

    執(zhí)行 ssh user@host 報錯,信息如下: 協(xié)議不匹配 可以使用如下命令 ssh -c aes128-cbc,aes192-cbc,aes256-cbc,3des-cbc user@host 也可以修改 ~/.ssh/config文件 vi ~/.ssh/config 增加配置 Ciphers +aes128-cbc,aes192-cbc,aes256-cbc

    2024年02月13日
    瀏覽(21)
  • JAVA加密解密異常之java.security.NoSuchAlgorithmException: Cannot find any provider supporting DES/CBC/PKCS7

    JAVA加密解密異常之java.security.NoSuchAlgorithmException: Cannot find any provider supporting DES/CBC/PKCS7

    AVA加密解密異常之java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/CBC/PKCS7Padding 網(wǎng)上最接近的解決辦法: 最后解決辦法: 1.在jdk中的jrelibsecurity修改java.security文件,替換security.provider.7=org.bouncycastle.jce.provider.BouncyCastleProvider。 并將原有的#security.provider.7=com.sun.s

    2024年02月03日
    瀏覽(19)
  • 關(guān)于Triple DES(3DES)對稱加密算法

    關(guān)于Triple DES(3DES)對稱加密算法

    一、引言 在網(wǎng)絡(luò)安全領(lǐng)域,對稱加密算法作為一種常見的加密手段,被廣泛應(yīng)用于保障數(shù)據(jù)傳輸?shù)谋C苄院屯暾?。其中,DES(Data Encryption Standard)算法作為一種經(jīng)典的對稱加密算法,由IBM于1970年代開發(fā),并于1977年被美國國家標(biāo)準(zhǔn)與技術(shù)研究院(NIST)確定為聯(lián)邦信息處理標(biāo)

    2024年02月04日
    瀏覽(29)
  • PHP 3DES加密

    不多說,直接上代碼類 然后自行依據(jù)實際情況調(diào)用即可 自行了解引用,有測試示例在代碼中 1. 2. 3. 4. 5. 6. 7.

    2024年02月13日
    瀏覽(32)
  • go語言對稱加密使用(DES、3DES、AES)

    進(jìn)行DES、3DES、AES三種對稱加密算法時,首先要對原始數(shù)據(jù)進(jìn)行字節(jié)填充,使原始數(shù)據(jù)位數(shù)與所對應(yīng)加密算法塊數(shù)據(jù)量成倍數(shù)。 block cipher(分組密碼、塊密碼) block size(塊大?。?DEA、3DES的block size為8位 AES的block size為16位 每個填充的字節(jié)都記錄了填充的總字節(jié)數(shù) \\\"a\\\" 填充后:

    2024年02月08日
    瀏覽(28)
  • 3DES實驗 思考與練習(xí):

    3DES實驗 思考與練習(xí):

    T1:關(guān)于3DES的分析 和 庫函數(shù)的思考——完全領(lǐng)悟了?。?! 分析過程: T(2): 使用openssl庫函數(shù) 實現(xiàn) DES加密: 使用函數(shù)DES_ecb_encrypt來進(jìn)行數(shù)據(jù)加解密 void DES_ecb_encrypt(const_DES_cblock *input,DES_cblock *output, DES_key_schedule *ks,int enc); 函數(shù)功能說明:DES ECB計算 參數(shù)說明: input: 輸入數(shù)據(jù);

    2024年02月03日
    瀏覽(22)
  • 【密碼算法 之一】對稱加密算法 DES \ 3DES 淺析

    【密碼算法 之一】對稱加密算法 DES \ 3DES 淺析

    ??DES(Data Encryption Standard)是1977年美國聯(lián)邦信息處理標(biāo)準(zhǔn)(FIPS)中所采用的一種對稱密碼(FIPS 46-3)。DES一直以來被美國以及其它國家的政府和銀行等廣泛使用。 ??然而,隨著計算機的進(jìn)步,現(xiàn)在DES已經(jīng)能夠被暴力破解,強度大不如從前了。20世紀(jì)末,RSA公司舉辦過破

    2024年02月09日
    瀏覽(22)
  • 密碼學(xué)之DES,3DES與Python實現(xiàn)AES

    最近項目中需要用到DES,3DES解密算法,所以了解一下。正好CSDN上有關(guān)于DES,3DES的資料。邊看邊寫一下總結(jié)。 密碼學(xué)之DES,3DES詳解與Python實現(xiàn) DES(Data Encryption Standard-數(shù)據(jù)加密標(biāo)準(zhǔn))屬于對稱加密,即使用相同的密鑰來完成加密和解密。分組長度為8個字節(jié)64bit(密鑰每個字節(jié)的最

    2024年02月08日
    瀏覽(21)
  • Java 中常見的加密算法,DES、3DES、AES、RSA

    Java 中常見的加密算法,DES、3DES、AES、RSA

    加密算法是一種將數(shù)據(jù)轉(zhuǎn)換為不可讀形式的算法,以保護(hù)數(shù)據(jù)的機密性和完整性。加密算法被廣泛應(yīng)用于計算機網(wǎng)絡(luò)、數(shù)據(jù)庫、電子商務(wù)等領(lǐng)域,用于保護(hù)敏感數(shù)據(jù)的安全性,如用戶密碼、信用卡信息、醫(yī)療記錄等。在 Java 中,有許多常見的加密算法,本文將對加密算法的基

    2024年02月03日
    瀏覽(33)
  • JavaScript學(xué)習(xí) -- 對稱加密算法3DES

    JavaScript學(xué)習(xí) -- 對稱加密算法3DES

    在現(xiàn)代的互聯(lián)網(wǎng)時代,數(shù)據(jù)安全性備受關(guān)注。為了保護(hù)敏感數(shù)據(jù)的機密性,對稱加密算法是一種常用的方法。在JavaScript中,3DES(Triple Data Encryption Standard)是一種常用的對稱加密算法。本篇博客將為您展示如何在JavaScript中使用3DES算法進(jìn)行加密和解密,并提供一個實際的例子

    2024年02月14日
    瀏覽(37)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包