NIST SP 800-90Ar1 Recommendation for Random Number Generation ... 分析与摘选之三

192 篇文章 62 订阅
13 篇文章 13 订阅

9. DRBG Mechanism Functions

四个关键函数InstantiateReseedGenerateUninstantiate中的前三个都需再进一步调用第10章提到的具体算法对应的相关函数。

9.0+ Get_entropy_input

函数:(status, entropy_input) = Get_entropy_input (min_entropy, min_length, max_length, prediction_resistance_request),

功能:获取entropy input(详情参见SP 800-90C)

输入参数:

  1. min_entropy:返回数据entropy_input的熵的最小比特。
  2. min_lengthmax_length:返回数据entropy_input的长度需满足min_length<=entropy_input长度<=max_ length。。
  3. prediction_resistance_request:请求的entropy_input是否能抵抗预测攻击(即函数内是否需要刷新entropy)

返回数据:

  1. status: 成功返回SUCCESS,失败返回错误信息。
  2. entropy_input:熵数据(其它函数用)。

执行步骤:

详情参见SP 800-90C。

9.1 DRBG Instantiate

函数:(status, state_handle ) = Instantiate_function (requested_instantiation_security_strength, prediction_resistance_flag, personalization_string):

功能:DRBG实例化(但不输出随机比特)

输入参数:

  1. requested_instantiation_security_strength:请求的安全强度(参考8.4节),不能大于算法支持的最大安全强度。算法安全强度可在算法参数信息表中查到。
  2. prediction_resistance_flag:让实例化的DRBG是否能抵抗预测攻击(仅当采用算法具有抵抗预测攻击能力时此标识设置为1才有效,算法是否具有抵抗预测攻击能力需查看算法的Administrative information中的prediction_resistance_flag是否设置为1)。
  3. personalization_string:可选参数,提供个性化信息。允许的最大长度max_personalization_string_length可在算法参数信息表中查到。

内部产生参数:

  1. entropy_input:调用函数Get_entropy_input获取,该函数详情参见第9章和SP 800-90C。
  2. nonce:临时数据,参见8.6.7节。可调用函数Get_entropy_input获取。

返回数据:

  1. status: 成功返回SUCCESS,失败返回错误信息。
  2. state_handle: 实例化后的内部状态,供后续功能函数使用。

执行步骤:

步骤1:若requested_instantiation_security_strength > 支持的最大安全强度,则返回(ERROR_FLAG, Invalid).

步骤2:若prediction_resistance_flag 设置为1, 但算法不支持prediction resistance(算法的Administrative information中的prediction_resistance_flag不是1),则返回(ERROR_FLAG, Invalid).

步骤3:若personalization_string的长度 > max_personalization_string(允许的最大长度),则返回(ERROR_FLAG, Invalid).

步骤4:将安全强度security_strength设置为{112, 128, 192, 256}中大于或者等于requested_instantiation_security_strength的最小值。即

步骤5:无(仅用于和以前版本的步骤编号对应)

步骤6:获取entropy input,(status, entropy_input) = Get_entropy_input (security_strength, min_length, max_length, prediction_resistance_request). 这里的status只表示Get_entropy_input的返回状态信息。

步骤7:若statusSUCCESS, 返回 (status, Invalid).

步骤8:获取nonce.

步骤9:调用具体的实例化算法(具体的实例化算法参见第10章)

initial_working_state = Instantiate_algorithm (entropy_input, nonce, personalization_string, security_strength).

步骤10:新建一个state_handle,如果创建失败则返(ERROR_FLAG, Invalid).

步骤11:把initial_working_state以及其他信息(如administrative information的security_strengthprediction_resistance_flag等)设置到state_handle

步骤12:返回 (SUCCESS, state_handle).

9.2 DRBG Reseed

函数:status = Reseed_function (state_handle, prediction_resistance_request, additional_input)

功能:DRBG重置种子

输入参数:

  1. state_handle:DRBG实例的句柄。
  2. prediction_resistance_request: 仅当实例化的prediction_resistance_flag置为1时,这里的prediction_resistance_request置为1才有效,否则报错
  3. additional_input: 可选输入参数。最大长度max_additional_input_length可在算法参数信息表中查到。

内部产生参数:

  1. entropy_input:熵信息。

返回数据:

  1. status: 成功执行信息。

执行步骤:

步骤1:使用state_handle获取当前内部状态。如果state_handle对应的内部状态异常,则返回ERROR_FLAG。

步骤2:若prediction_resistance_request设置为1,但prediction_resistance_flag为0,则返回ERROR_FLAG。

步骤3:若additional_input的长度 > max_additional_input_length, 返回ERROR_FLAG。

步骤4获取entropy input

(status, entropy_input) = Get_entropy_input (security_strength, min_length, max_length, prediction_resistance_request)

步骤5:若 status ≠ SUCCESS,返回status。

步骤6:使用reseed算法获取新的工作状态。

new_work_state=Reseed_algorithm(work_state,entropy_input,additional_input)

步骤7:用新的工作状态更新实例句柄state_handle中的工作状态。

步骤8:返回SUCCESS。

9.3 DRBG Generate

函数:(status, pseudorandom_bits) = Generate_function (state_handle, requested_number_of_bits, requested_security_strength, prediction_resistance_request, additional_input)

功能:生成随机比特(需在Instantiation或者Reseeding之后)

输入参数:

  1. state_handle:DRBG实例的句柄。
  2. requested_number_of_bits:请求的随机比特长度,不能大于单次请求的最大长度max_number_of_bits_per_request,该值可在算法参数表中查到。
  3. requested_security_strength:请求的安全强度,不能大于内部状态内记录的安全强度(详情见Instantiating的步骤4)。
  4. prediction_resistance_request: 是否抵抗预测攻击
  5. additional_input: 可选输入参数。最大长度max_additional_input_length可在算法参数信息表中查到。

内部产生参数:无

返回数据:

  1. status: 成功返回SUCCESS,失败返回错误信息。
  2. pseudorandom_bits: 随机比特或者空串(异常时)

执行步骤:

步骤1:使用state_handle获取当前内部状态。如果state_handle对应的内部状态异常,则返回(ERROR_FLAG, NULL)。

步骤2:若requested_number_of_bits > max_number_of_bits_per_request,则返回(ERROR_FLAG, NULL)。

步骤3:若requested_security_strength > 内部状态的security_strength,则返回(ERROR_FLAG, NULL)。

步骤4additional_input的长度 > max_additional_input_length,则返回(ERROR_FLAG, NULL)。

步骤5prediction_resistance_request置为1,但prediction_resistance_flag不是1,则返回(ERROR_FLAG, NULL)。

步骤6将局部变量reseed_required_flag置零。

步骤7reseed_required_flag为1或prediction_resistance_request为1,执行如下步骤:

    1. 7.1 status = Reseed_function (state_handle, prediction_resistance_request, additional_input)。
    2. 7.2 若 status ≠ SUCCESS,则返回(ERROR_FLAG, NULL)。
    3. 7.3 使用state_handle获取新的内部状态。
    4. 7.4 将additional_input设置为空串。
    5. 7.5将reseed_required_flag置零。

步骤8(status, pseudorandom_bits, new_working_state) = Generate_algorithm (working_state, requested_number_of_bits, additional_input).

注意:Generate_algorithm函数会刷新工作状态,所以返回new_working_state

步骤9status值标示需先进行reseed再生成随机比特,则执行如下步骤:

    1. 9.1将reseed_required_flag置1。
    2. 9.2 若prediction_resistance_flag为1,将prediction_resistance_request值1.
    3. 9.3跳转到步骤7

步骤10用新的状态替换state_handle 中的状态。

步骤11返回(SUCCESS, pseudorandom_bits).

整体流程较为简单,故略去流程图。

说明:在调用Generate_algorithm之前可能需要先执行一次Reseed_function

  • 情况a:输入参数prediction_resistance_request1,需抵抗预测攻击而改变状态。
  • 或情况breseed_required_flag1,这是Generate_algorithm函数内判断需要Reseed

9.4 DRBG Uninstantiate

函数:Uninstantiate_function (state_handle)

功能:DRBG反初始化

输入参数:

  1. state_handle:DRBG实例的句柄。

返回数据:

  1. status: 成功返回SUCCESS,失败返回错误信息。

执行步骤:

步骤1:若state_handle 表示的状态无效,返回ERROR_FLAG)。

步骤2擦除内部状态信息。

步骤3返回SUCCESS。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值