精华内容
下载资源
问答
  • 填充
    千次阅读
    2021-07-28 03:45:48

    在Excel中,利用“自动填充”功能,可以干什么?

    自动填充就是可以在单元格中用鼠标直接拉出数字来

    Excel填充颜色的快捷键是什么?怎么设置的啊?

    excel填快捷键:

    图黄色背景的就是填充色的表格

    如果只是作填充颜色,可以击一次填充颜色按钮,在下次一继续填充的时候按F4就可以了,F4是重复上一步操作

    设置固定的快捷键,首先找到“工具”——“宏”——“录制新宏”这就开始设置新的快捷键喽

    这里输入一个快捷键,必须是Ctrl 某个字母,还可以更改宏名,最后需要点击下面的“确定”按钮

    点击确定后,首先点击那个填充颜色的标志,点完填充颜色后再点击这个停止键,如图红色圈内所示

    现在需要填充那个地方就先点击这个表格,然后按下指定的快捷键。

    Excel表格 填充底色的快捷键是什么?

    Excel表格,填充底色的快捷键是:ALT H,然后接着再按H(或按一次ALT H也可以)。

    当我们为Excel单元格添加底色时,按动ALT H H 后,系统会自动调动调色板窗口,然后点击选择合适的颜色,确认即可。

    其实,在我们按动第一次ALT H的时候,excel系统还提供了各种操作上的快简介提示,

    如:ALT H C --复制;

    ALT H B--表格线;

    ALT H 1--字体加粗;

    ALT H 2--字体变斜体等等。

    扩展资料:

    Excel处理工作表常用快捷键:

    新建工作表---Shift F11或Alt Shift F1

    移动到工作簿中的下一张工作表---Ctrl PageDown

    移动到工作簿中的上一张工作表---Ctrl PageUp

    选定当前工作表和下一张工作表---Shift Ctrl PageDown

    取消选定多张工作表---Ctrl PageDown

    选定其他的工作表---Ctrl PageUp

    选定当前工作表和上一张工作表---Shift Ctrl PageUp

    对当前工作表重命名---Alt O H R

    移动或复制当前工作表---Alt E M

    删除当前工作表---Alt E L

    EXCEL中,如何使用填充格式填充很多行?

    根据你要的的不同 有不同的方法:

    1果你是要复制公式的话 一定是要填充的公式 与左边的列是同样的数量 那么 你就可以 在第一个单元格输入完公式后 让这个 单元格处于选中状态 而不是编辑状态 然后 鼠标移动到 这个单元格 的右下角 双击那个 小黑点 就可以自动向下填充 直到与左边的数据平齐……

    2、如果你要填充一个序列数字的话(比如你想要把已有的数据记录添加序号)那么你就可以 先在第一和第二两个单元格 分别输入1、2 然后 一起选中这两个单元格 然后 双击右下角的小黑点……

    以上两种方法 如果在以后数据的最左边的列 则 右边的列 中间不能有空格 否则会在空格处 终止……

    3、使用定位 ctrl G 打开窗口 输入 你要复制的范围 ;或者 你在编辑栏的左边单元格名称框输入定位区域;然后 在编辑栏输入 第一个单元格的内容 比如公式 然后 按住 ctrl 再按回车 就自动填充了你输入的内容 (公式可以 但是 序列数字 就不可以这样了)

    在word表格中,如何像用excle一样,使用“填充柄”自动填充可以计算大量数据???

    WORD不能像EXCEL中那样拖拉的

    但是可以复制有公式的单元格,然后选中需要添加公式的列,粘贴,然后选中内容按F9更新结果就可以了

    excel自动填充怎样快速填充一列?

    设数据如图:

    将公式

    =rank(b2,b:b)复粘贴到"c2"格.

    将公式中的3个"b"改为要排名的数在列的列标,对准右下角,成" "状时双击,如图:

    如果要以排名排序,则光标放在"c1"单元格,点

    ,如图:

    Excel中如何快速填充空白单元格

    是空白单元格要成同一个内,则

    则选中单元格区域---在编中写入要填充的---按下CTRL 回车键

    如果是单元格区域中的空白单元格要填充成同一个内容,则

    选中要填充的单元格区域----按下F5键----定位条件---空值----确定---在编辑栏中写入要填充的内容---按下CTRL 回车键

    如果是要将有内容的单元格区域填充成空白

    则复制一个空单元格----选中要填充成空白单元格的区域----右键----粘贴

    更多相关内容
  • 存储填充测试工具.apk

    2021-08-25 20:03:19
    适配最新Android11及一下版本,使用非常简单 1.支持大量文件填充, 2.支持特大文件填充,图片填充,破损apk填充 3.支持填充手机存储至0M,模拟极端情况下app调试运行情况。
  • 在PyTorch中可以对图像和Tensor进行填充,如常量值填充,镜像填充和复制填充等。在图像预处理阶段设置图像边界填充的方式如下: import vision.torchvision.transforms as transforms img_to_pad = transforms....
  • Wincc7.5中如何绘制不规则图形并填充背景颜色?
  • 绘制圆形并填充斜线,可自定义圆的半径, 定义直线的倾角,角度值(-90°至90°),定义直线的间距
  • Android内存填充apk

    2018-10-12 17:13:18
    Android填充内存神器,将此apk install进手机,选择需要填充的百分比就OK了
  • 自动填充数据工具

    2018-10-15 10:44:00
    android 自动填充数据工具FillData,模仿用户填充手机内存工具,安装使用,卸载后清空所填充的内存
  • 种子填充 matlab 数字图像处理 实现对图像的选点填充 供大家来参考
  • CAD填充图案制作插件
  • java区域填充

    2018-11-29 00:47:56
    采用种子填充方法对界面进行填充,全程用Java 实现。。
  • 为了报表设计美观,通常设定固定格式报表,需要自动填充数据。可以设定每页填充数据条数。
  • 图形学 填充 C语言

    2017-11-15 20:19:15
    图形学实验,C语言填充,种子填充算法,如有问题QQ303320503
  • 清除input自动填充

    2017-10-11 18:39:23
    清除input在浏览器中自动填充用户名等的情况,JQuery解决,IE8 ,chrome等均可以使用。
  • Android存储填充工具

    2017-08-16 16:41:02
    用于填充Android手机内部存储,SD卡,OTG的磁盘空间。
  • OPENGL扫描线填充算法

    2018-12-04 09:53:45
    扫描线填充.rar,扫描线填充,.vs,扫描线填充,v15,Browse.VC.db,.suo,ipch,AutoPCH,61737355d0251ab8,MAIN.ipch,扫描线填充.sln,扫描线填充,扫描线填充.vcxproj.filters,main.cpp,扫描线填充.vcxproj.user,Debug,扫描...
  • MATLAB对小于某个面积大小的空洞进行填充,在MATLAB自带的空洞填充代码上加上面积限制
  • 计算机图形学的大实验,直线、圆、多边形画法,多边形填充算法,包括扫描线填充、四方向种子填充和种子栈填充,方法是,先画好多边形,点击多边形填充方法,选择好颜色后,点击...注意,种子填充法,多边形不要画太大
  • 选择题自动填充系统是一款可以将已有答案自动填充到每题括号里面或者题号前面的软件,软件自动填充比起手动填充不是一个级别。这是2016年最新一版,功能很多很实用。高效填充软件。有详细教程,选择题自动填充系统从...
  • 自定义填充
  • java生成合同.rar,java生成合同,操作方法.txt,合同.doc,最终合同.jpg,replaceWords.java,合同-原版.jpg,合同.xml1、将word合同要填空的地方用变量"$fieldxx@"填充,并另存为XML格式 2、通过java程序可以将xml里面的...
  • 种子填充算法,扫描线填充算法,带报告

    千次下载 热门讨论 2012-01-15 13:07:49
    多边形的区域填充 学时:2 实验类型:设计性 实验类别:专业实验 实验目的 1. 通过实验,进一步理解和掌握几种常用多边形填充算法的基本原理 2. 掌握多边形区域填充算法的基本过程 3. 掌握在C/C++环境下用多边形填充...
  • 让PPT图片填充不变形的方法。填充图片或者纹理填充(选择图片填充)将图片平铺为纹理,如果要调整图片平铺的大小,可在缩放比例X,Y轴上调百分比。通过调整偏移量可调整图片在填充形状的位置。
  • 不同方式的多边形填充
  • 简单的C# WinForm颜色填充,操作方法: 鼠标左键在图片上任意点击点,鼠标右键则可把说有的点连接起来并填充指定的颜色。(其实可以用多个曲线组合来填充
  • pandas dataframe统计填充空值大全

    千次阅读 2022-03-22 11:05:18
    按列填充空值 def t5(): df = pd.DataFrame({ 'name': ['lili', 'lucy','pegga','alin',np.nan], 'age': [18, 16, np.nan, 23, np.nan], 'salary': [np.nan, 300, np.nan, 1000, 800] }) print(df) df.name = df....

    1.判断dataframe是否有空值

    def t2():
        df = pd.DataFrame({
            'name': ['lili', 'lucy','pegga','alin',np.nan],
            'age': [18, 16, np.nan, 23, np.nan],
            'salary': [np.nan, 300, np.nan, 1000, 800]
        })
        df_contains_nan = df.isnull()
        print(df_contains_nan)
    
        df_contains_nan_2 = df.isna()
        print(df_contains_nan_2)
    

    上面的代码将输出

        name    age  salary
    0  False  False    True
    1  False  False   False
    2  False   True    True
    3  False  False   False
    4   True   True   False
        name    age  salary
    0  False  False    True
    1  False  False   False
    2  False   True    True
    3  False  False   False
    4   True   True   False
    

    isnull,isna方法都是判断df中的元素是否为空,然后输出True/False。
    要判断df中是否有空元素,只需要稍加改变

    def t3():
        df = pd.DataFrame({
            'name': ['lili', 'lucy','pegga','alin',np.nan],
            'age': [18, 16, np.nan, 23, np.nan],
            'salary': [np.nan, 300, np.nan, 1000, 800]
        })
        contains_nan = df.isnull().values.any()
        print(contains_nan)
    

    any方法只要ndarray中有任意一个元素为True就返回True。

        def any(self, axis=None, out=None, keepdims=False): # real signature unknown; restored from __doc__
            """
            a.any(axis=None, out=None, keepdims=False)
            
                Returns True if any of the elements of `a` evaluate to True.
            
                Refer to `numpy.any` for full documentation.
            
                See Also
                --------
                numpy.any : equivalent function
            """
            pass
    

    2.统计空值个数

    def t4():
        df = pd.DataFrame({
            'name': ['lili', 'lucy','pegga','alin',np.nan],
            'age': [18, 16, np.nan, 23, np.nan],
            'salary': [np.nan, 300, np.nan, 1000, 800]
        })
    
        # 每一列有多少个nan
        nan_column = df.isnull().values.astype(int).sum(axis=0)
        # 各列的nan个数
        nan_column_name = df.isnull().sum()
        print(nan_column)
        print('*'*10)
        print(nan_column_name)
        print('*'*10)
        # nan的总个数
        nan_all = df.isnull().sum().sum()
        print(nan_all)
    
    [1 2 2]
    **********
    name      1
    age       2
    salary    2
    dtype: int64
    **********
    5
    

    上面的代码,展示了统计每行/列空值的个数,以及所有空值的个数。

    3.按列填充空值

    def t5():
        df = pd.DataFrame({
            'name': ['lili', 'lucy','pegga','alin',np.nan],
            'age': [18, 16, np.nan, 23, np.nan],
            'salary': [np.nan, 300, np.nan, 1000, 800]
        })
        print(df)
    
        df.name = df.name.fillna('unknown')
        df.age = df.age.fillna(df.age.mean())
        df.salary = df.salary.fillna(df.salary.max())
    
        print(df)
    
        name   age  salary
    0   lili  18.0     NaN
    1   lucy  16.0   300.0
    2  pegga   NaN     NaN
    3   alin  23.0  1000.0
    4    NaN   NaN   800.0
          name   age  salary
    0     lili  18.0  1000.0
    1     lucy  16.0   300.0
    2    pegga  19.0  1000.0
    3     alin  23.0  1000.0
    4  unknown  19.0   800.0
    

    上面的代码,分别对name, age, salary列按固定值,当前列平均值,当前列最大值填充。

    fillna函数有inplace参数,下面代码的效果与之前填充一致。

    def t52():
        df = pd.DataFrame({
            'name': ['lili', 'lucy','pegga','alin',np.nan],
            'age': [18, 16, np.nan, 23, np.nan],
            'salary': [np.nan, 300, np.nan, 1000, 800]
        })
        print(df)
    
        df.name.fillna('unknown', inplace=True)
        df.age.fillna(df.age.mean(), inplace=True)
        df.salary.fillna(df.salary.max(), inplace=True)
        print(df)
    

    4.按分组平均值填充

    def t6():
        df = pd.DataFrame({
            'level': ['A','A','A','A','B','B','B','B','C','C','C'],
            'score': [2,1,3,np.nan,4,6,5,np.nan,7,9,np.nan],
        })
    
        fun = lambda x: x.fillna(df.groupby('level').score.mean()[x.level])
        df = df.apply(lambda x: fun(x), axis=1)
        # 以下一行代码也可以实现相同功能
        #df = df.apply(lambda x: x.fillna(df.groupby('level').score.mean()[x.level]), axis=1)
        print(df)
    

    上面的代码,将score按level分组的平均值填充。
    fun传入一行数据,然后通过分组值来获取当前分组的平均值,最后利用fillna来填充这个平均值即可。

    代码输出如下

       level  score
    0      A    2.0
    1      A    1.0
    2      A    3.0
    3      A    2.0
    4      B    4.0
    5      B    6.0
    6      B    5.0
    7      B    5.0
    8      C    7.0
    9      C    9.0
    10     C    8.0
    
    展开全文
  • VS2008xia MFC编程,计算机图形学画图程序:包括递归种子填充、简单种子填充、扫描线种子填充、图案填充
  • 将已有答案填充到题目号前面另有一个版本将已有答案填充到题目括号里面
  • 该算法是matlab下的canny算法,并且对canny的结果进行填充,得到目标区域
  • 详解填充Excel 5.1 简单填充Excel 5.2 填充列表 5.3 复杂的填充 5.4 横向的填充 5.5 多列表组合填充 5. 详解填充Excel 5.1 简单填充Excel EasyExcelTemplateFile.xlsx 先在excel模板文件中设定好模板样式。注意:{}...

     
    愿你如阳光,明媚不忧伤。

     


    5. 详解填充Excel

    5.1 简单填充Excel

    • EasyExcelTemplateFile.xlsx
      先在excel模板文件中设定好模板样式。注意:{}前面加上转义符\会忽略该属性。

      在这里插入图片描述

    • EasyExcelData.java
      创建与Excel模板相对应的实体类。

    public class EasyExcelFillData {
        private String name;
        private Double age;
        // 省略get和set
    }
    
    • EasyExcelDataController.java
      填充Excel,这里提供两种方式填充
    @RestController
    @RequestMapping("/easyExcel")
    public class EasyExcelDataController extends BaseController {
        @Resource
        EasyExcelDataListener easyExcelDataListener;
        // 指定需要读的excel文件
        String fileName = "C:/Users/ISCCF_A/Desktop/EasyExcelData.xlsx";
    
    	// 省略读取和写入部分
    
        @RequestMapping("/fill")
        public JsonResult<? extends Object> simpleFill(int mode) {
            log.info(startLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
            // Excel模板文件
            String templateFileName = "C:/Users/ISCCF_A/Desktop/EasyExcelTemplateFile.xlsx";
            // 要填充的文件
            String fillAimFileName = "C:/Users/ISCCF_A/Desktop/EasyExcelFillAimFile.xlsx";
            if (mode == 1) {
                // 方案1 根据对象填充
                // 这里会填充到第一个sheet,然后文件流会自动关闭
                EasyExcelFillData fillData = new EasyExcelFillData();
                fillData.setName("张三");
                fillData.setAge(24.2);
                EasyExcel.write(fillAimFileName).withTemplate(templateFileName).sheet().doFill(fillData);
                log.info(endLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
                return new JsonResult<EasyExcelFillData>(fillData, "Excel填充数据成功!");
            } else {
                // 方案2 根据Map填充
                // 这里会填充到第一个sheet,然后文件流会自动关闭
                Map<String, Object> map = new HashMap<String, Object>();
                map.put("name", "李四");
                map.put("age", 26.5);
                EasyExcel.write(fillAimFileName).withTemplate(templateFileName).sheet().doFill(map);
                log.info(endLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
                return new JsonResult<Map<String, Object>>(map, "Excel填充数据成功!");
            }
        }
    }
    

    浏览器访问 http://localhost:8080/easyExcel/fill?mode=1

    在这里插入图片描述

    • EasyExcelFillAimFile.xlsx

    在这里插入图片描述

    5.2 填充列表

    • EasyExcelTemplateFile.xlsx
      先在excel模板文件中设定好模板样式。注意:{}前面加上转义符\会忽略该属性。 模板中{.} 多了个点,表示list。

    在这里插入图片描述

    • EasyExcelUtil.java
      创建填充数据
    public class EasyExcelUtil {
        public static List<EasyExcelFillData> testFillData() {
            List<EasyExcelFillData> list = new ArrayList<>();
            for (int i = 0; i < 10; i++) {
                EasyExcelFillData data = new EasyExcelFillData();
                data.setName("OUSEKI" + i);
                data.setAge(18 + i * Math.random());
                list.add(data);
            }
            return list;
        }
    }
    
    • EasyExcelDataFillController.java
    @RestController
    @RequestMapping("/easyExcelFill")
    public class EasyExcelDataFillController extends BaseController {
        // Excel模板文件
        String templateFileName = "C:/Users/ISCCF_A/Desktop/EasyExcelTemplateFile.xlsx";
        // 要填充的文件
        String fillAimFileName = "C:/Users/ISCCF_A/Desktop/EasyExcelFillAimFile.xlsx";
        // 写入Excel的数据
        List<EasyExcelFillData> list = EasyExcelUtil.testFillData();
        
        @RequestMapping("/listFill")
        public void listFill(int mode) {
            log.info(startLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
            if (mode == 1) {
                // 方案1:一下子全部放到内存里面并填充
                // 这里会填充到第一个sheet, 然后文件流会自动关闭
                EasyExcel.write(fillAimFileName).withTemplate(templateFileName).sheet().doFill(list);
            } else {
                // 方案2:分多次填充,会使用文件缓存(省内存)
                ExcelWriter excelWriter = EasyExcel.write(fillAimFileName).withTemplate(templateFileName).build();
                WriteSheet writeSheet = EasyExcel.writerSheet().build();
                excelWriter.fill(list, writeSheet);
                // 可以填充另一个文件中的内容,我这里没做额外数据
                excelWriter.fill(list, writeSheet);
                // 千万别忘记关闭流
                excelWriter.finish();
            }
            log.info(endLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
        }
    }
    

    浏览器访问 http://localhost:8080/easyExcelFill/listFill?mode=10

    在这里插入图片描述

    5.3 复杂的填充

    • EasyExcelTemplateFile.xlsx
      先在excel模板文件中设定好模板样式。注意:{}前面加上转义符\会忽略该属性。 模板中{.} 多了个点,表示list。

    在这里插入图片描述

    • EasyExcelDataFillController.java
    @RestController
    @RequestMapping("/easyExcelFill")
    public class EasyExcelDataFillController extends BaseController {
        // Excel模板文件
        String templateFileName = "C:/Users/ISCCF_A/Desktop/EasyExcelTemplateFile.xlsx";
        // 要填充的文件
        String fillAimFileName = "C:/Users/ISCCF_A/Desktop/EasyExcelFillAimFile.xlsx";
        // 写入Excel的数据
        List<EasyExcelFillData> list = EasyExcelUtil.testFillData();
        
        @RequestMapping("/complexFill")
        public void complexFill() {
            log.info(startLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
            ExcelWriter excelWriter = EasyExcel.write(fillAimFileName).withTemplate(templateFileName).build();
            WriteSheet writeSheet = EasyExcel.writerSheet().build();
            // 这里注意,入参用了forceNewRow,代表在写入list的时候不管list下面有没有空行 都会创建一行,然后下面的数据往后移动。默认 是false,会直接使用下一行,如果没有则创建。
            // forceNewRow如果设置了true,有个缺点 就是他会把所有的数据都放到内存了,所以慎用!
            // 简单的说,如果你的模板有list,且list不是最后一行,下面还有数据需要填充 就必须设置 forceNewRow=true 但是这个就会把所有数据放到内存,会很耗内存。
            FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
            excelWriter.fill(list, fillConfig, writeSheet);
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("date", new Date());
            map.put("total", 1000);
            excelWriter.fill(map, writeSheet);
            excelWriter.finish();
            log.info(endLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
        }
    }
    

    浏览器访问 http://localhost:8080/easyExcelFill/complexFill

    在这里插入图片描述

    5.4 横向的填充

    • EasyExcelTemplateFile.xlsx
      先在excel模板文件中设定好模板样式。注意:{}前面加上转义符\会忽略该属性。 模板中{.} 多了个点,表示list。

    在这里插入图片描述

    • EasyExcelDataFillController.java
    @RestController
    @RequestMapping("/easyExcelFill")
    public class EasyExcelDataFillController extends BaseController {
        // Excel模板文件
        String templateFileName = "C:/Users/ISCCF_A/Desktop/EasyExcelTemplateFile.xlsx";
        // 要填充的文件
        String fillAimFileName = "C:/Users/ISCCF_A/Desktop/EasyExcelFillAimFile.xlsx";
        // 写入Excel的数据
        List<EasyExcelFillData> list = EasyExcelUtil.testFillData();
        
        @RequestMapping("/horizontalFill")
        public void horizontalFill() {
            log.info(startLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
            ExcelWriter excelWriter = EasyExcel.write(fillAimFileName).withTemplate(templateFileName).build();
            WriteSheet writeSheet = EasyExcel.writerSheet().build();
            FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build();
            excelWriter.fill(list, fillConfig, writeSheet);
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("date", new Date());
            excelWriter.fill(map, writeSheet);
            // 别忘记关闭流
            excelWriter.finish();
            log.info(endLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
        }
    }
    

    浏览器访问 http://localhost:8080/easyExcelFill/horizontalFill

    在这里插入图片描述

    5.5 多列表组合填充

    • EasyExcelTemplateFile.xlsx
      先在excel模板文件中设定好模板样式。注意:{}前面加上转义符\会忽略该属性。 模板中{.} 多了个点,表示list。

    在这里插入图片描述

    • EasyExcelDataFillController.java
    @RestController
    @RequestMapping("/easyExcelFill")
    public class EasyExcelDataFillController extends BaseController {
        // Excel模板文件
        String templateFileName = "C:/Users/ISCCF_A/Desktop/EasyExcelTemplateFile.xlsx";
        // 要填充的文件
        String fillAimFileName = "C:/Users/ISCCF_A/Desktop/EasyExcelFillAimFile.xlsx";
        // 写入Excel的数据
        List<EasyExcelFillData> list = EasyExcelUtil.testFillData();
        
        @RequestMapping("/compositeFill")
        public void compositeFill() {
            log.info(startLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
            ExcelWriter excelWriter = EasyExcel.write(fillAimFileName).withTemplate(templateFileName).build();
            WriteSheet writeSheet = EasyExcel.writerSheet().build();
            FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build();
            // 如果有多个list,模板上必须有{前缀.} 这里的前缀就是data1,然后多个list必须用FillWrapper包裹
            excelWriter.fill(new FillWrapper("data1", list), fillConfig, writeSheet);
            excelWriter.fill(new FillWrapper("data2", list), writeSheet);
            excelWriter.fill(new FillWrapper("data3", list), writeSheet);
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("date", new Date());
            excelWriter.fill(map, writeSheet);
            // 别忘记关闭流
            excelWriter.finish();
            log.info(endLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
        }
    }
    

    浏览器访问 http://localhost:8080/easyExcelFill/compositeFill

    在这里插入图片描述

    展开全文
  • 加密算法之PKCS填充

    千次阅读 2022-03-31 01:01:37
    一些加密方式,例如AES的ECB、CBC、PCBC模式加密时,如果明文分块没有对齐,则需要填充填充有很多种方式,本章描述的正是填充方式。 公钥加密标准(Public Key Cryptography Standards, PKCS),由美国RSA数据安全...

    一些加密方式,例如AES的ECB、CBC、PCBC模式加密时,如果明文分块没有对齐,则需要填充,填充有很多种方式,本章描述的正是填充方式。

    公钥加密标准(Public Key Cryptography Standards, PKCS),由美国RSA数据安全公司及其合作伙伴制定的一组公钥密码学标准,其中包括证书申请、证书更新、证书作废表发布、扩展证书内容以及数字签名、数字信封的格式等方面的一系列相关协议。下表是PKCS规范汇总,稍作了解即可。

    版本名称简介
    PKCS #12.1RSA密码编译标准(RSA Cryptography Standard)定义了RSA的数理基础、公/私钥格式,以及加/解密、签/验章的流程。1.5版本曾经遭到攻击。
    PKCS #2-撤销原本是用以规范RSA加密摘要的转换方式,现已被纳入PKCS#1之中。
    PKCS #31.4DH密钥协议标准(Diffie-Hellman key agreement Standard)规范以DH密钥协议为基础的密钥协议标准。其功能,可以让两方通过金议协议,拟定一把会议密钥(Session key)。
    PKCS #4-撤销原本用以规范转换RSA密钥的流程。已被纳入PKCS#1之中。
    PKCS #52.0密码基植加密标准(Password-based Encryption Standard)参见RFC 2898与PBKDF2。
    PKCS #61.5证书扩展语法标准(Extended-Certificate Syntax Standard)将原本X.509的证书格式标准加以扩充。
    PKCS #71.5密码消息语法标准(Cryptographic Message Syntax Standard)参见RFC 2315。规范了以[公开密钥基础设施(PKI)所产生之签名/密文之格式。其目的一样是为了拓展数字证书的应用。其中,包含了S/MIME与CMS。
    PKCS #81.2私钥消息表示标准(Private-Key Information Syntax Standard).Apache读取证书私钥的标准。
    PKCS #92.0选择属性格式(Selected Attribute Types)定义PKCS#6、7、8、10的选择属性格式。
    PKCS #101.7证书申请标准(Certification Request Standard)参见RFC 2986。规范了向证书中心申请证书之CSR(certificate signing request)的格式。
    PKCS #112.20密码设备标准接口(Cryptographic Token Interface (Cryptoki))定义了密码设备的应用程序接口(API)之规格。
    PKCS #121.0个人消息交换标准(Personal Information Exchange Syntax Standard)定义了包含私钥与公钥证书(public key certificate)的文件格式。私钥采密码(password)保护。常见的PFX就履行了PKCS#12。
    PKCS #13椭圆曲线密码学标准(Elliptic curve cryptography Standard)制定中。规范以椭圆曲线密码学为基础所发展之密码技术应用。椭圆曲线密码学是新的密码学技术,其强度与效率皆比现行以指数运算为基础之密码学算法来的优秀。然而,该算法的应用尚不普及。
    PKCS #14拟随机数产生器标准(Pseudo-random Number Generation)制定中。规范拟随机数产生器的使用与设计。
    PKCS #151.1密码设备消息格式标准(Cryptographic Token Information Format Standard)定义了密码设备内部数据的组织结构。

    对称加密常用的是PKCS#5和PKCS#7 Padding。而非对称的填充算法常用的是PKCS#1_v1.5以及OAEP(PKCS#1_v2)。

    1 PKCS#1_PADDING

    从上表也可以看出,PKCS#1针对的是RSA算法。RSA加密数据的长度和密钥位数有关,常用的密钥长度有1024bits,2048bits等,理论上1024bits的密钥可以加密的数据最大长度为1024bits(即1024/8 = 128bytes)。2048bits的密钥可以加密的数据最大长度为2048bits(2048/8 = 256bytes),但是RSA在实际应用中不可能使用这种“教科书式的RSA”系统。实际应用中RSA经常与填充技术(padding)一起使用,可以增加RSA的安全性。填充技术如果比较弱,较小的明文和小型公开指数e将易于受到攻击。

    RSA有如下三种填充方式:

    填充方式输入输出
    RSA_PKCS1_PADDING必须 比 RSA 秘钥 短至少11个字节, 也就是 RSA_size(rsa) – 11和秘钥一样长
    RSA_PKCS1_OAEP_PADDINGRSA_size(rsa) – 41和秘钥一样长
    RSA_NO_PADDING可以和RSA秘钥一样长,如果输入的明文过长,必须切割,然后填充和秘钥一样长

    1.1 RSA_PKCS1_PADDING(V1.5)

    pkcs1padding V1.5是RSA加解密默认的填充方式。在进行RSA运算时需要将源数据D转化为Encryption block(EB)。其中pkcs1padding V1.5的填充模式按照以下方式进行。

    EB = 00 + BT + PS + 00 + D
    
    • EB:为填充后的16进制加密数据块,长度为1024/8 = 128字节(密钥长度1024位的情况下)
    • 00:开头为00,是一个保留位
    • BT:用一个字节表示,在目前的版本上,有三个值00、01、02,如果使用公钥操作,BT为02(加密),如果用私钥操作则可能为00或01(签名)
    • PS:填充位,PS = k - 3 - D 个字节,k表示密钥的字节长度,如果我们用1024bit的RSA密钥,k=1024/8=128字节,D表示明文数据D的字节长度,如果BT为00,则PS全部为00,如果BT为01,则PS全部为FF,如果BT为02,PS为随机产生的非0x00的字节数据。
    • 00:在源数据D前一个字节用00表示
      D:实际源数据

    由上可知,当使用 RSA_PKCS1_PADDING填充时,BT=2,明文前填充的PS是随机值,所以相同的明文、相同的公钥加密得到的密文是不同的,这在一定程度上提高了RSA算法的安全性。由于PKCS#1规范建议PS的最小长度为8,所以可加密的明文最大长度为密钥长度-3-8,即小于等于密钥长度-11。

    1.2 RSA_PKCS1_OAEP_PADDING

    RSA_PKCS1_OAEP_PADDING填充模式是PKCS#1推出的新填充方式。RSA_PKCS1_PADDING(V1.5)的缺点是无法验证解密的结果的正确性,为了解决该问题,RSA_PKCS1_OAEP_PADDING引入了类似HMAC消息验证码的算法(可见4.2小节),原理就是填充了一些与原文相关的哈希值,解密后可以进行验证,大致流程如下图所示。

    1. 生成一个k0位的随机数r
    2. 原文m补上 k1位0,得到消息M, k1 = n - size(m) - k0
    3. 补位后的消息M与hash函数 G®进行异或操作,得到X
    4. 然后随机数r与X的hash值进行异或操作,得到Y
    5. 将X与Y合并成补位后的消息
      在这里插入图片描述
      RSA_PKCS1_OAEP_PADDING是目前RSA填充方式里安全性最高的一种,代价则是可加密的明文长度较短(密钥长度-41)。

    1.3 RSA_NO_PADDING

    RSA_NO_PADDING填充方式并不表示无填充,当选择RSA_NO_PADDING填充模式时,如果明文不够128字节(RSA1024的情况),加密的时候会在明文前面填充若干数据0,直至达到128字节。解密后的明文也会包括前面填充的零,需要注意把解密后的字段前向填充的零去掉,才是真正的明文。

    2 PKCS#7_PADDING

    假设数据长度需要填充n(n>0)个字节才对齐,那么填充n个字节,每个字节都是n。如果数据本身就已经对齐了,则填充一块长度为块大小的数据,每个字节都是块大小,这么做是为了与长度不对齐的情况保持处理流程一致。

    3 PKCS#5_PADDING

    PKCS#5_PADDING是PKCS#7_PADDING的子集,即块大小固定为8字节。PKCS#5_PADDING方式加密可以用PKCS#7_PADDING方式解密,而PKCS#7_PADDING加密则不一定可以用PKCS#5_PADDING方式解密,除非块大小是8。

    4 ZeroPadding

    数据长度不对齐时使用0填充,否则不填充。用ZeroPadding填充时,没办法区分真实数据与填充数据,所以只适合以\0结尾的字符串加解密。

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,153,517
精华内容 461,406
关键字:

填充

友情链接: df8291a7.rar