字符串加密_??途W(wǎng)

【題目描述】
有一種技巧可以對(duì)數(shù)據(jù)進(jìn)行加密,它使用一個(gè)單詞作為它的密匙。下面是它的工作原理:首先,選擇一個(gè)單詞作為密匙,如TRAILBLAZERS。如果單詞中包含有重復(fù)的字母,只保留第1個(gè),其余幾個(gè)丟棄?,F(xiàn)在,修改過(guò)的那個(gè)單詞屬于字母表的下面,如下所示:

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

T R A I L B Z E S C D F G H J K M N O P Q U V W X Y

上面其他用字母表中剩余的字母填充完整。在對(duì)信息進(jìn)行加密時(shí),信息中的每個(gè)字母被固定于頂上那行,并用下面那行的對(duì)應(yīng)字母一一取代原文的字母(字母字符的大小寫狀態(tài)應(yīng)該保留)。因此,使用這個(gè)密匙,Attack AT DAWN(黎明時(shí)攻擊)就會(huì)被加密為Tpptad TP ITVH。

請(qǐng)實(shí)現(xiàn)下述接口,通過(guò)指定的密匙和明文得到密文。

詳細(xì)描述:

接口說(shuō)明

原型:

voidencrypt(char * key,char * data,char * encrypt);

輸入?yún)?shù):

char * key:密匙

char * data:明文

輸出參數(shù):

char * encrypt:密文

返回值:

void
【代碼及解題思路】

/*思路:
 * 1、創(chuàng)建方法1去除字符串中重復(fù)的字符
 * 2、創(chuàng)建方法2去除字符串A中包含的所有字符串B中的字符
 * 3、創(chuàng)建一個(gè)字符串table存放A-Z的字符
 * 4、將key轉(zhuǎn)換為大寫,利用方法1對(duì)密鑰進(jìn)行去重處理,得到新的密鑰newKey
 * 5、newKey字符串的長(zhǎng)度為ln,截取table區(qū)間為[0,ln)的字符子串,保存起來(lái)。
 * 6、利用方法2 去除table中包含newKey的字符,同5拼接起來(lái)。形成加密的方式table2
 * 7、利用循環(huán)遍歷明文text中的每一個(gè)字符,分情況處理大小寫字符
 * 8、如果是大寫字符,直接減去'A’得到一個(gè)差值diff,替換為table2中第diff的字符
 * 9、如果是小寫字符,直接減去'A'再減去32,得到一個(gè)差值diff,替換為table2中第diff的字符對(duì)應(yīng)的小寫
 * 10、大小寫的判斷 字符-'A'>=32就是小寫
 * 
 */
public class TestEncode {
    public static void main(String[] args) {
        String table1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        Scanner sc = new Scanner(System.in);
        String key = sc.nextLine();
        String text = sc.nextLine();
        //去重
        String newKey = dst1(key.toUpperCase());
        int lk = newKey.length();//新密鑰的長(zhǎng)度
        //新的加密表
        String table2 = newKey + dst2(table1,newKey);
        String result = "";
        for(int i=0;i<text.length();i++){
            int diff = text.charAt(i) - 'A';
            if(diff < 32){//大寫字母
                result += table2.charAt(diff);
            }else{//小寫
                diff = diff - 32;
                char temp = table2.charAt(diff);//對(duì)應(yīng)的大寫
                result += (char)(temp +32);
            }
        }
        System.out.println(table1);
        System.out.println(table2);
        System.out.println(result);
        
    }
    /**
     * 去除字符串中重復(fù)的字符
     * 用StringBuffer sb存放結(jié)果
     * 對(duì)字符串的每一個(gè)字符進(jìn)行遍歷,每次遍歷都同前面的字符比較,如果相同
     * 就不往sb中添加,如果不同就添加
     * @param st
     * @return st
     */
    public static String dst1(String st){
        StringBuffer sb = new StringBuffer();
        int len = st.length();
  Loop1:for(int i=0;i<len;i++){
            for(int j=0;j<i;j++){
                if(st.charAt(i)==st.charAt(j))
                    continue Loop1;
            }
            sb.append(st.charAt(i));
        }
        return sb.toString();
    }
    /**
     * 去除st1中包含的st2的所有字符
     * 1 用StringBuffer sb存放結(jié)果
     * 2 遍歷st1中的每一個(gè)字符,如果該字符在st2中則不往sb中添加,否則添加
     * @param st1
     * @param st2
     * @return
     */
    public static String dst2(String st1,String st2){
        StringBuffer sb = new StringBuffer();
        int len1 = st1.length();
        int len2 = st2.length();
        
   Loop1:for(int i=0;i<len1;i++){
            for(int j=0;j<len2;j++){
                if(st1.charAt(i)==st2.charAt(j)){
                    continue Loop1;
                    }
            }
            sb.append(st1.charAt(i));
        }
        return sb.toString();
    }
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • CTF中那些腦洞大開(kāi)的編碼和加密 0x00 前言 正文開(kāi)始之前先閑扯幾句吧,玩CTF的小伙伴也許會(huì)遇到類似這樣的問(wèn)...
    查無(wú)此人asdasd閱讀 6,432評(píng)論 0 19
  • 1. 字符串最后一個(gè)單詞的長(zhǎng)度 計(jì)算字符串最后一個(gè)單詞的長(zhǎng)度,單詞以空格隔開(kāi)。知識(shí)點(diǎn) 字符串,循環(huán)運(yùn)行時(shí)間限制 ...
    Acamy丶閱讀 1,516評(píng)論 0 1
  • 在C語(yǔ)言中,五種基本數(shù)據(jù)類型存儲(chǔ)空間長(zhǎng)度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來(lái)閱讀 4,035評(píng)論 0 2
  • 概述 之前一直對(duì)加密相關(guān)的算法知之甚少,只知道類似DES、RSA等加密算法能對(duì)數(shù)據(jù)傳輸進(jìn)行加密,且各種加密算法各有...
    Henryzhu閱讀 3,214評(píng)論 0 14
  • 【怎么,見(jiàn)到我有這么吃驚嗎?】 “……臥槽……” 一連串的國(guó)產(chǎn)粗口在喉頭滾動(dòng),硬生生擠出來(lái)的卻只有最常用那倆字。 ...
    老醋散筆閱讀 389評(píng)論 0 1

友情鏈接更多精彩內(nèi)容