javascript实现列置换算法加密与解密

列置换加密算法

列置换密码原理:Column Permutation Cipher属于置换密码的一种,其加密过程大致如下:把明文按某一顺序排列成一个矩阵,其中不足部分用符号Φ填充。然后按另一顺序选出矩阵中的字母以形成密文,最后截成固定长度的字母组成密文。由加密过程可知,改变矩阵的大小和选出顺序可以得到不同形式的密码。

偶然间看到这个加密方式 心血来潮实现简单版实现

function columnSwapEncrypt(str,key,padding){
    // 替换掉非字母
    str=str.replace(/[^a-zA-Z]/g,'')
    let numStr=[]
    let orderArr=Array.from({length:len})
    let keyLen=len=key.length
    // 得到key的ASCLL码 暂时只做了小写的
    for(let i of key){
        numStr.push(Number(i.charCodeAt()-96))
    }
    // 对key出现的顺序得到新的顺序数组 比如 b c a d 得到[2,3,1,4]
    while(len--){
        let curMax=Math.max.apply(null, numStr);
        let curMaxIndex=numStr.findIndex(item=>item==curMax)
        numStr.splice(curMaxIndex,1,-1)
        orderArr[curMaxIndex]=len+1
    }
    // 要填充的个数
    let paddingNum=keyLen-(str.length%keyLen)
    // 如果要填充 填充内容追加在明文后
    if(paddingNum!==0)str+=Array.from({length:paddingNum},v=>padding).join('')
    // 分为多少列
    let column=Math.ceil(str.length/keyLen)
    // 初始化密文 用数组存储
    let result=Array.from({length:str.length})
    // 对orderArr的顺序来填充 以一列为单位来连续填充
    // 比如[2,3,1,4] 明文按此顺序排列 然后参照此密文顺序以列为单位输出密文
    for(var k=0;k

列置换解密算法

/**
 *解密
 *
 * @param {*} code 密文
 * @param {*} key 密钥
 * @param {*} padding 占位符
 */
function columnSwapDecrypt(code, key, padding) {
    let numStr = [],
        len
    let orderArr = Array.from({ length: len })
    let keyLen = (len = key.length)
    for (let i of key) {
        numStr.push(Number(i.charCodeAt() - 96))
    }
    while (len--) {
        let curMax = Math.max.apply(null, numStr)
        let curMaxIndex = numStr.findIndex((item) => item == curMax)
        numStr.splice(curMaxIndex, 1, -1)
        orderArr[curMaxIndex] = len + 1
    }
    let column = Math.ceil(code.length / keyLen)
    let result = []
    // 与加密一样 求出密钥顺序顺组
    for (let k = 0; k < orderArr.length; k++) {
        // 取出每一项
        let curColumn = orderArr[k]
        // 这里是竖着赋值每一列 顺序是按照orderArr循环的顺序 但是赋值是取出具体的值来赋值
        for (var m = 0; m < column; m++) {
            // 因为orderArr最小是1 所以这里要-1
            result[k + m * keyLen] = code[(curColumn - 1) * column + m]
        }
    }
    // 最后去掉占位符
    return result.join("").replace(padding, "")
}

写的粗劣 当个记录 如有错误 麻烦指出

你可能感兴趣的:(javascript,加密算法,前端)