精华内容
下载资源
问答
  • RSA密钥长度、明文长度和密文长度

    万次阅读 2015-05-04 22:39:46
    本文介绍RSA加解密中必须考虑到的密钥长度、明文长度和密文长度问题,对第一次接触RSA的开发人员来说,RSA算是比较复杂的算法,RSA算法本身其实也很简单,RSA的复杂度是因为数学家把效率和安全也考虑进去的缘故。...

    本文介绍RSA加解密中必须考虑到的密钥长度、明文长度和密文长度问题,对第一次接触RSA的开发人员来说,RSA算是比较复杂的算法,RSA算法本身其实也很简单,RSA的复杂度是因为数学家把效率和安全也考虑进去的缘故。

    本文先只谈密钥长度、明文长度和密文长度的概念知识,RSA的理论及示例等以后再谈。提到密钥,我们不得不提到RSA的三个重要大数:公钥指数e、私钥指数d和模值n。这三个大数是我们使用RSA时需要直接接触的,理解了本文的基础概念,即使未接触过RSA的开发人员也能应对自如的使用RSA相关函数库,无需深入了解e、d、n是如何生成的,只需要知道我该如何用、要注意什么。

    一、密钥长度

    1、密钥是指谁?

    首先我们说的“密钥”是指谁?由于RSA密钥是(公钥+模值)、(私钥+模值)分组分发的,单独给对方一个公钥或私钥是没有任何用处,所以我们说的“密钥”其实是它们两者中的其中一组。但我们说的“密钥长度”一般只是指模值的位长度。目前主流可选值:1024、2048、3072、4096...

    2、模值主流长度是多少?

    目前主流密钥长度至少都是1024bits以上,低于1024bit的密钥已经不建议使用(安全问题)。那么上限在哪里?没有上限,多大都可以使用。所以,主流的模值是1024位,实际运算结果可能会略小于1024bits,注意,这个值不是绝对的,跟素数的生成算法有关系,只是告诉素数生成器“帮我生成一个接近1024位的素数而已”,然后生成器“好,给您一个,这个差不多1024位”。

    素数生成器这么厉害?说生成1024位就会出个1024位的大整数?真实的情况是素数生成器也只是在1024bits对应的整数附近进行“摸索”而已,大家其实都不容易,又要快又要准确又要随机性,那么素数生成器也只能应付一下,找到1024位的算是好运,没找到1024位,1023位也照样送出来:)。

    3、公钥指数如何确定?

    公钥指数是随意选的,但目前行业上公钥指数普遍选的都是65537(0x10001,5bits),该值是除了1、3、5、17、257之外的最小素数,为什么不选的大一点?当然可以,只是考虑到既要满足相对安全、又想运算的快一点(加密时),PKCS#1的一个建议值而已。

    有意的把公钥指数选的小一点,但是对应私钥指数肯定很大,意图也很明确,大家都要用公钥加密,所以大家时间很宝贵,需要快一点,您一个人私钥解密,时间长一点就多担待,少数服从多数的典型应用。

    4、私钥指数如何确定?

    公钥指数随意选,那么私钥就不能再随意选了,只能根据算法公式(ed%k=1,k=(p-1)(q-1))进行运算出来。那么私钥指数会是多少位?根据ed关系,私钥d=(x*k+1)/e,所以单看这个公式,私钥指数似乎也不是唯一结果,可能大于也可能小于1024bits的,但我们习惯上也是指某个小于1024bits的大整数。

    包括前文的公钥指数,在实际运算和存储时为方便一般都是按照标准位长进行使用,前面不足部分补0填充,所以,使用保存和转换这些密钥需要注意统一缓冲区的长度。

    二、明文长度

    网上有说明文长度小于等于密钥长度(Bytes)-11,这说法本身不太准确,会给人感觉RSA 1024只能加密117字节长度明文。实际上,RSA算法本身要求加密内容也就是明文长度m必须0<m<n,也就是说内容这个大整数不能超过n,否则就出错。那么如果m=0是什么结果?普遍RSA加密器会直接返回全0结果。如果m>n,运算就会出错?!那怎么办?且听下文分解。

    所以,RSA实际可加密的明文长度最大也是1024bits,但问题就来了:

    如果小于这个长度怎么办?就需要进行padding,因为如果没有padding,用户无法确分解密后内容的真实长度,字符串之类的内容问题还不大,以0作为结束符,但对二进制数据就很难理解,因为不确定后面的0是内容还是内容结束符。

    只要用到padding,那么就要占用实际的明文长度,于是才有117字节的说法。我们一般使用的padding标准有NoPPadding、OAEPPadding、PKCS1Padding等,其中PKCS#1建议的padding就占用了11个字节。

    如果大于这个长度怎么办?很多算法的padding往往是在后边的,但PKCS的padding则是在前面的,此为有意设计,有意的把第一个字节置0以确保m的值小于n。

    这样,128字节(1024bits)-减去11字节正好是117字节,但对于RSA加密来讲,padding也是参与加密的,所以,依然按照1024bits去理解,但实际的明文只有117字节了。

    关于PKCS#1 padding规范可参考:RFC2313 chapter 8.1,我们在把明文送给RSA加密器前,要确认这个值是不是大于n,也就是如果接近n位长,那么需要先padding再分段加密。除非我们是“定长定量自己可控可理解”的加密不需要padding。

    三、密文长度

    密文长度就是给定符合条件的明文加密出来的结果位长,这个可以确定,加密后的密文位长跟密钥的位长度是相同的,因为加密公式:

    C=(P^e)%n

    所以,C最大值就是n-1,所以不可能超过n的位数。尽管可能小于n的位数,但从传输和存储角度,仍然是按照标准位长来进行的,所以,即使我们加密一字节的明文,运算出来的结果也要按照标准位长来使用(当然了,除非我们能再采取措施区分真实的位长,一般不在考虑)。

    至于明文分片多次加密,自然密文长度成倍增长,但已不属于一次加密的问题,不能放到一起考虑。

    展开全文
  • 最近在做一些程序题目,需要获取字符串长度。 有这么几个函数,却不知道区别。sizeof() 、strlen()、str.length(); (C/C++ strlen(str)和str.length()和str.size()都可以求字符串长度。 其中str.length()和str....

     ********************2021时隔六年更新一下***********************

    很久没登CSDN博客啦,好多人骂我哈哈,我更新一下,三年没写代码量手生了。

    17年毕业在搞了两年研发,搞了一年产品报价,搞了一年渠道管理,现在有点迷茫……

     

    言归正传,又跑了一遍。除了构造函数有点没写好之外,最后的结论我和当初写的一样的呀。

    为啥每年都有人骂我呢?

     

     

    代码在线运行 - 在线工具 (tool.lu)

     

    #include <iostream>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string>
    
    #include <cstring>
     
    using namespace std;
    
    int main()
    {
    char a[]={'a','b','c'};
     //sizeof(a)的值应该为3。
    char b[]={"abc"};
    //sizeof(b)的值应该是4。
    char str[]={'a','b','c','\0','X'};
    //那么sizeof(str)为5,strlen(str)为3。
    
        
     std::cout << "Hello World"<<endl<<sizeof(a)<<endl<<sizeof(b)<<endl<<sizeof(str)<<endl<<strlen(str);
        return 0;
    }

     

    ********************分割线一下为2015历史************************

      最近在做一些程序题目,需要获取字符串长度。

    有这么几个函数,却不知道区别。sizeof() 、strlen()、str.length();

     

    (C/C++ strlen(str)和str.length()和str.size()都可以求字符串长度。

    其中str.length()和str.size()是用于求string类对象的成员函数

    strlen(str)是用于求字符数组的长度,其参数是char*。)

     

        第一种:strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个'\0',如果你只定义没有给它赋初值,这个结果是不定的,它会从aa首地址一直找下去,直到遇到'\0'停止。

        第二种:sizeof(),求所占总空间的字节数。

    这里例如

    char[] a={'a','b','c'};

    sizeof(a)的值应该为3。

    char[] b={"abc"};

    sizeof(b)的值应该是4。

    若string str={'a','b','c','\0','X'};

    那么sizeof(str)为5,strlen(str)为3。

     

    展开全文
  • 我想知道怎么设定输入框的长度,比如<input type="text" value="1" /> 这个长度可能就 | 1 | 这么长 但是我想让我的这个输入框长一点 比如 | 1 | 该用什么来设定?
  • java怎么获取list长度

    万次阅读 多人点赞 2018-06-19 20:08:38
    java 怎么获取list长度java中的length属性是针对数组说的,比如说你声明了一个数组,想知道这个数组的长度则用到了length这个属性java中的length()方法是针对字符串String说的,如果想看这个字符串的长度则用到length()...
    1. java中的length属性是针对数组说的,比如说你声明了一个数组,想知道这个数组的长度则用到了length这个属性
    2. java中的length()方法是针对字符串String说的,如果想看这个字符串的长度则用到length()这个方法
    3. java中的size()方法是针对泛型集合说的,如果想看这个泛型有多少个元素,就调用此方法来查看

    方法一:超级for循环遍历for(String attribute : list) {System.out.println(attribute)}

    方法二:对于ArrayList来说速度比较快, 用for循环, 以size为条件遍历for(int i = 0 ; i < list.size() ; i++) {system.out.println(list.get(i));}

    方法三:集合类的通用遍历方式, 从很早的版本就有, 用迭代器迭代Iterator it = list.iterator();while(it.hasNext()) {System.ou.println(it.next)}

     

     

     

     

    展开全文
  • sizeof获取数组长度

    万次阅读 2016-10-06 21:17:38
    昨天开始看《算法导论》这本书,第一个算法就是(直接)插入排序,根据书里给出的伪代码写出了...是固定的,如果要更换待排序数组话,原来程序中的相关变量就会因为数组长度的改变要做相应的改变。我想要的就是给定任

    昨天开始看《算法导论》这本书,第一个算法就是(直接)插入排序,根据书里给出的伪代码写出了C语言代码,也根据自己的理解重新写了一个。虽然实现了算法的基本要求,但有些细节没有处理好,今天就来完善一下。

    在昨天实现的代码中,用来测试的数组int array[] = {5,2,4,6,1,3};是固定的,如果要更换待排序数组话,原来程序中的相关变量就会因为数组长度的改变要做相应的改变。我想要的就是给定任意的数组,在不修改任意代码的条件下实现插入排序。所以,核心问题就是怎么获取给定数组中的元素个数。

    自然而然想到的就是sizeof(C/C++中的一个操作符,其功能是返回一个对象或者类型所占的内存字节数)。

    一、首先来看看怎么获取整数数组的长度

    sizeof的语法形式如下:

    (1)sizeof( object ); // sizeof( 对象 );
    (2)sizeof( type_name ); // sizeof( 类型 );
    (3)sizeof object; // sizeof 对象;

    个人喜欢使用sizeof()的形式,因为形式统一,而且可以避免引起混乱导致出错。

    假设有一给定数组 int array[] = {5,2,4,6,1,3};

    length为数组array[]中的元素个数,那么

    length = sizeof(array)/sizeof(*array);            //表达式1
    //length = sizeof(array)/sizeof(array[0]);        //表达式2
    //length = sizeof(array)/sizeof(int);             //表达式3

    上述三个表达式都能得到正确的结果,虽然表达式略有不同,但原理是相同的,即通过sizeof(array)获取整个数组所占的内存字节数,再通过sizeof(*array)或者sizeof(array[0])或者sizeof(int)来获取每个元素所占的字节数,数组所占的字节数除以每个元素所占的字节数就是该数组的元素个数了。

    二、字符串数组长度的获取

    char str[] = {"This is a string!"};
    length = sizeof(str)-1;//包含空格

    之所结果要减1,是因为字符串结束符'\0‘在数组中占用了一个字节。

    三、源代码

    /**************************************
    *获取字符串长度(元素个数)  By 羽墨
    *print_length.c
    ***************************************/
    #include <stdio.h>
    
    void main()
    {
    	int array[] = {5,2,4,6,1,3};
    	char str[] = {"This is a string!"};
        int length = sizeof(array)/sizeof(*array);
    	printf("The length of string '%s' is %d\n",str,sizeof(str)-1);
    	printf("The length of array is %d\n",length);
    }

    运行结果

    The length of string 'This is a string!' is 17
    The length of array is 6

    四、注意

    1、如果在定义数组时就给定了数组的大小,如int array[len];,则不管数组中初始化了多少个(显然应不大于len)元素,最后的数组中的元素个数都是len。所以要想获得数组中真实元素的个数,在初始化数组时应注意这一点。

    2、向子函数传递数组后,然后在子函数内部获取数组长度。先来看一个错误示例程序:

    int getLength(int array[])
    {
        int length;
        length=sizeof(array)/sizeof(array[0]); 
        return length;
    }
    
    len = getLength(array);
    printf("The length of array is %d\n",len);

    这样得到的结果始终都是1。因为数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址。在本示例中,函数名array传递到子函数后就完全退化为一个指针,该指针指向的是数组array所在的地址,即数组array第一个元素array[0]所在的地址。也就是说系统只是告诉该函数这个存储空间存有数据,但并没有告诉函数这个数据存储空间有多大。sizeof(array)的结果是指针变量array所占内存的字节数,具体大小与系统有关,一般在32位机器上占4个字节,array[0]是int类型,同样占4个字节,所以结果为1。所以要获得数组的长度最好在数组定义所在的区域内。

    对于上述情形,查阅资料后给出两种解决方案:

    (1)进入子函数后用函数memcpy将数组拷贝出来,函数memcpy所需要的长度由另一个形参传递进来,像这样:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    /**************************************
    *摘自360百科(稍作修改)  By 羽墨
    *将数组内容拷贝到函数内部
    ***************************************/
    void fun(char *p, int len)
    {
    	char *pData;
    	pData = (char*) malloc (len+1);      //申请内存空间
    	memcpy(pData, p, len+1);             //拷贝数组
    	printf("%s\n",pData);
    	//计算数组大小(略)
    	free(pData);                          //释放内存
    	pData = NULL;
    }
    int main(int argc, char *argv[])
    {
    	char str[] = {"This is a string!"};//初始化数组
    	fun(str, 17);
    
        return 0;
    }

    个人觉得没有必要怎么做。如果能够所需的长度作为形参传递到子函数中,显然就不需要在子函数当中另行计算,so,请看另一个方案。

    (2)在子函数外部计算好元素个数后作为形参传递到子函数中进行其他操作。在这里仅给出(直接)插入排序算法的main函数,insert_sort(array,length)函数只需将子函数中用于记录数组元素个数的临时变量length放进子函数的参数列表即可。

    #include <stdio.h>
    
    void print_array(int *arr, int len);
    
    int main(int argc, char *argv[])
    {
    	int array[] = {5,2,4,6,1,3};
    	char str[] = {"This is a string!"};
    	int length = sizeof(array)/sizeof(*array);    //计算数组中的元素个数
    
    	printf("The original");
    	print_array(array, length);
    
    	insert_sort(array,length);                     //插入排序
    
    	printf("The sorted");
    	print_array(array, length);                    //输出排序结果
    
        return 0;
    }
    
    void print_array(int *arr, int len)
    {
    	int i = 0;
    
    	for(i=0;i<len;i++)
    	{
    		printf("%d ", arr[i]);
    	}
    }

    这样一来,对于任意的目标序列都可以直接进行排序而不需要修改任何程序语句。

    展开全文
  • C语言之 字符串长度的计算方法

    万次阅读 多人点赞 2018-08-16 20:39:04
    (1)计算字符串长度时关键是要注意辨认转义字符;(2)一个转义字符总是以反斜杠开始,再加一个其他字符组成。所以,遇到反斜杠时要特别注意!!! 1、不带转义字符的字符 如:“abc!x=/”,其长度为7 2、带转义...
  • 字符串长度 与数组长度

    万次阅读 多人点赞 2018-12-20 18:48:37
    对于定义 char str[] = "abc\000def\n"(注:其中0为数字零),求字符串str的长度len和数组str的大小size,len和size分别是: (2分)(2) 12 ,13 3 ,11 3 ,9 3 ,4 1.数组长度的计算:整形数组大小:sizeof...
  • 今天在做RSA加密的时候遇到了一个这样的错误:...加密数据长度 &lt;= 模长-11解决办法:将要加密的数据截取后分段加密 下面是关于RSA算法密钥长度/密文长度/明文长度的介绍本文转自:http://blog.sina.com.cn/s...
  • 1 java中的length属性是针对数组说的,比如说你声明了一个数组,想知道这个数组的长度则用到了length这个属性. 2 java中的length()方法是针对字符串String说的,如果想看这个字符串的长度则用到length()这个方法. 3....
  • Python求单词长度并根据长度排序

    千次阅读 2020-04-29 10:19:31
    对单词长度排序,分行输出单词长度及其单词。 1.1 输入格式 行1:单词个数n 分行输入n个单词 1.2 输出格式 分行输出单词长度及其单词。(单词长度,单词)用元组表示 1.3 输入样例 5 python list set ...
  • 4.X 的版本表示的是字节长度,会根据字符集转变内容字节长度存储。 int(2) 中的2 ,表示的并非是int类型只能输入2位数字,而是只能显示2位数字范围,可以添加11位的int的任何数字。 Oracle Oracle中varchar2...
  • Windows文件名长度限制

    万次阅读 2014-10-22 08:30:08
    260个长度是作为总的文件名长度限制。 例如: 所在文件夹的长度为50 则文件名的长度被限制在210之下,超出的话会被进行截断。 如果在程序中的话,超出长度的话MoveFile/CopyFile会返回错误,处理失败。 例子: 1....
  • C/C++ | 求数组长度 | 求字符串数组长度 | 求string类型长度; 数组长度 int arr[] = {1,2,3,4,5,6,7,8,9}; int length = 0; length = sizeof(arr) / sizeof(int); int arr[10]={0,0}; //这样的无法...
  • Oracle中varchar2类型的字段长度单位默认是按照byte来定义, 比如常见写法varchar2(10) 代表只接收最大10字节长度 这种定义情况下10字节只能插入3个汉字,(数字字母只占一字节,汉字占三字节) 如果插入4个汉字...
  • win 10 设置静态ip 子网前缀长度

    万次阅读 2019-07-03 12:44:46
    如果是255.255.255.0那么子网前缀就是24 计算方法:255转换为二进制数为8个1长度就是8 如果是255.255.255.255 就是4个8 子网前缀长度就是32 如果是255.255.255.0 就是3个8 子网前缀长度就是24 ...
  • 度量快速开发平台中基础函数中有一个 len 的获取字符长度函数。具体用法是: len ("123Abc字符串")  这个方法得到的结果是:9  即一共有多少个字符,没有区分单字节与双字节的情况。 如果某一个字段...
  • Lua中获取字符串长度整理

    万次阅读 2018-10-31 22:58:41
    在Lua中,获取字符串长度我们一般使用#str(不建议使用string.len(str))! local str = "abc" local len = #str print(len) -- 3 str = "你们好" len = #str print(len) -- 9 这里就出现了一个问题:为啥"abc...
  • char a[] = {'a','b','c'}; char b[] = "abc"; 请问下数组a和数组b的长度我理解的是都为3,但是答案是b的长度大于a的长度, 不太明白后面那个是不是要算上\0呢,这个长度是要用strlen计算么
  • 1.我们经常 mysql创建 varchar(20) name这个 20长度 究竟是表示的字符数还是字节数?根编码字符集又有没有关系? 首先 mysql 5.X 以上的版本的 定义中 表示的字符长度,如上varchar(20)你既可以添加20个英文字符,...
  • C语言如何计算数组的长度

    万次阅读 多人点赞 2018-05-04 17:17:46
    (1)借助sizeof()函数 :#include&lt;stdio.h&gt;int main(){ // 定义一个整型数组, 并进行... // 计算数组中数据长度 : // 所有数据的字节数除以一个数据的字节数即为数据的个数 :  length = sizeof(arr) / ...
  • 参考文章:Python返回数组(List)长度的方法
  • 单词长度

    千次阅读 2017-04-20 10:34:14
    你要输出这行文本中每个单词的长度。这里的单词与语言无关,可以包括各种符号,比如“it's”算一个单词,长度为4。注意,行中可能出现连续的空格。 输入格式: 输入在一行中给出一行文本,以‘.’结束,结尾...
  • input输入框长度

    千次阅读 2019-04-24 15:44:19
    input输入框长度

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 614,499
精华内容 245,799
关键字:

长度