Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我需要帮助解释这意味着什么res+;=(char)((c+;key.charAt(j)-2*';A';)%26+;';A';); 公共静态字符串加密(字符串文本,最终字符串密钥) { 字符串res=“”; text=text.toUpperCase(); 对于(inti=0,j=0;i_Java - Fatal编程技术网

Java 我需要帮助解释这意味着什么res+;=(char)((c+;key.charAt(j)-2*';A';)%26+;';A';); 公共静态字符串加密(字符串文本,最终字符串密钥) { 字符串res=“”; text=text.toUpperCase(); 对于(inti=0,j=0;i

Java 我需要帮助解释这意味着什么res+;=(char)((c+;key.charAt(j)-2*';A';)%26+;';A';); 公共静态字符串加密(字符串文本,最终字符串密钥) { 字符串res=“”; text=text.toUpperCase(); 对于(inti=0,j=0;i,java,Java,我基本上只是想了解什么是“res+=(char)((c+key.charAt(j)-2*'A')%26+'A'); “这意味着。我很清楚这是字符串的某种附加?但是我可以理解它的其余部分是什么意思。该方法的名称有误。这不是加密。或者,如果是的话,这是一种3岁的狒狒可以“解密”的加密 char实际上是一种数字数据类型,因此您可以执行类似2*'a'的操作。数字是unicode代码。由于这显然是基于ascii码的,而且所有ascii码都直接映射到它们的unicode等效码,没有任何更改,因此您可以在we

我基本上只是想了解什么是“res+=(char)((c+key.charAt(j)-2*'A')%26+'A');
“这意味着。我很清楚这是字符串的某种附加?但是我可以理解它的其余部分是什么意思。

该方法的名称有误。这不是加密。或者,如果是的话,这是一种3岁的狒狒可以“解密”的加密

char
实际上是一种数字数据类型,因此您可以执行类似
2*'a'
的操作。数字是unicode代码。由于这显然是基于ascii码的,而且所有ascii码都直接映射到它们的unicode等效码,没有任何更改,因此您可以在web上搜索任何内容。”例如,“A”只是另一种写入
65
的方式

因此,让我们从以下方面开始:

c+key.charAt(j)-2*'A'

按照java优先规则的工作方式,首先解析
2*'A'
,因此这将从
c+key.charAt(j)
中减去130。如果将其视为:
(c-'A')+(key.charAt(j)-'A')
,则更容易理解。这个公式总是产生与你所得到的完全相同的结果,因为我只是移动了一些术语(我将
-2*'A'
解构成
-'A'-'A'
,这总是可行的,然后移动了一些术语)

c
是一个字符值,但由于它前面的
if
,我们可以确定内容在'a'(65)和'Z'(90)之间

键可以是任何东西(从粘贴中看不清楚),但看起来一般的想法是键只由大写字母组成,所以也就是65-90

假设密钥是'WORLD',要加密的文本是'HELLO'

那就归结为:
('W'-'A')+('H'-'A')
('W'-'A')
只是在计算字母表中字母W的“索引”A'是0字母。B是1个字母。C是2个字母。W是22个字母。然后我们对这个职位的钥匙上的字母做同样的事情。。。把它们加在一起。W是22个字母,H是7个字母,因此这变成了
29

接下来,它将对该设置执行
%26
<代码>%是余数:将29除以26,抛出结果,保留余数。所以,3。(26%26=0,27%26=1.等等)。它是26的原因是因为字母表中有26个字母。如果我让你在“D”后面加上“B”,你可以告诉我:好的,那就是“E”。但是如果我让你在“B”后面加上“Z”,那是怎么回事?好吧,我们“循环”一下,这就变成了“A”。这就是
%26
正在实现的:循环行为

然后,我们将其添加到“A”中,并将结果视为一个字符<代码>3+'A'变成
'D'
。这只是将索引号(5个字母)转换回实际的字母<代码>0+'A'是A,
1+'A'
是B,等等

请注意,如果该键包含非大写字母(例如,如果它包含空格),该算法会做一些奇怪的事情,并以负数结束。显然,这个“编码器环”级疯狂的作者没有考虑这一点。

那么,这条线的意义是什么? 这就是加密协议的工作原理:

给定一个键“ABC”和明文“HELLOWORLD”,我们循环遍历明文中的每个字母。对于每个字母,我们在键中找到匹配的字母。在这里,明文比键长,通过循环键就可以解决这个问题。因此,“HELLOWORLD”与“abcabca”匹配(为什么?这就是
j=++j%key.length();
的意思)

因此,在hello world中加密
H
的结果是:

(/*明文*/'H'+/*键*/'A'-'A'-'A')%26+'A'
,它只是
H

因此,在hello world中加密
E
的结果是:

(/*明文*/'E'+/*键*/'B'-'A'-'A')%26+'A'
,它只是
F

换句话说,如果密钥字符是,比如说,“C”,那么明文中的字母通过添加2来“加密”。D变为F,A变为C,X变为Z,它绕着地球转;Z变成B


使用密钥ABC对文本进行加密的“加密”协议的结果是:
HFNLPZOSND

请解释您不理解该表达式的哪一部分。res+=(char)((c+key.charAt(j)-2*'A')%26+'A');这部分,我只是不明白“c+key.charAt(j)-2*'A')%26+'A'到底是做什么的。非常感谢!这实际上是我们信息保证和安全课程的一部分,因为我们有在线课程,我们只能自己照顾自己。我们的任务是制作这个维格纳密码,我发现了这个,我一辈子都不明白为什么他使用字符,就好像他们在解上是整数一样。再一次!非常感谢你!!
public static String encrypt(String text, final String key)
{
    String res = "";
    text = text.toUpperCase();
    for (int i = 0, j = 0; i < text.length(); i++)
    {
        char c = text.charAt(i);
        if (c < 'A' || c > 'Z')
            continue;
        //              (0 + A - 2 * A) % 26 + A
        
        res += (char) ((c + key.charAt(j) - 2 * 'A') % 26 + 'A');

        //System.out.println("C: "+ c +" i: "+i+ " j: "+j + " key.char: "+key.charAt(j) + " res: " + res);
        
        j = ++j % key.length();
    }
    return res;
}