After much hunting through core code it looks like the default on my site for a node that hasn't been saved yet is "en" instead of "und". I'm not sure why.

However it causes field_get_items('node', $node, $field['field_name']) to return FALSE in the loop.

function _encrypted_text_node_field_names(&$node) {
  $items = array();
  $fields = field_info_field_by_ids();
  foreach ($fields as $field) {
    if ($field['module'] === 'text') {
      if (field_get_items('node', $node, $field['field_name'])) {
        $instance = field_info_instance('node', $field['field_name'], $node->type);
        if ($instance['settings']['text_encryption']) {
          $items[] = $field['field_name'];
        }
      }
    }
  }
  return $items;
}

I propose using field_info_instance('node', $field['field_name'], $node->type) instead of field_get_items('node', $node, $field['field_name']) because it will return a value if it is valid or null if it is not.

Any comments?